Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Вниз

Посоветйте книгу по SQL С ЗАДАНИЯМИ   Найти похожие ветки 

 
Галинка ©   (2008-02-01 12:30) [0]

пососветовал тут вчера святой рыцарь поштудировать OUTER JOIN. Я про него почитала. А для пробы задание придумать не могу. ((( Может есть книга какая, сразу с заданиями?


 
clickmaker ©   (2008-02-01 12:35) [1]


> А для пробы задание придумать не могу

есть список писем. Для простоты - 3 поля ID, Subject, Body
отдельно есть список прочитанных писем. ID, User_ID, ReadDate. Если письмо не прочитано юзером User_ID, его нет в этом списке.
Как определить, что письмо с конкр. ID не прочитано текущим юзером?


 
Игорь Шевченко ©   (2008-02-01 13:03) [2]

Все-таки в Германии полная задница. Как они еще умудряются пиво производить - уму непостижимо.


 
ketmar ©   (2008-02-01 13:07) [3]

фигня у них пиво.


 
Romkin ©   (2008-02-01 13:10) [4]

http://www.sql-ex.ru


 
Брюнетка ©   (2008-02-01 13:53) [5]

> [0] Галинка ©   (01.02.08 12:30)
> пососветовал тут вчера святой рыцарь поштудировать OUTER JOIN. Я про него почитала.

А как же ты раньше с базами работала? Не зная про join?
Просто интересно -)


 
Kolan ©   (2008-02-01 13:59) [6]

> http://www.sql-ex.ru

Этот дядька(автор сайта) у меня вел семестр :). Мы прам по этим заданиям в нете и зачет сдавали :)


 
isasa ©   (2008-02-01 14:00) [7]

Брюнетка ©   (01.02.08 13:53) [5]
А как же ты раньше с базами работала? Не зная про join?


:)

А оно надо, если существует WHERE ?


 
Kolan ©   (2008-02-01 14:04) [8]

> А оно надо, если существует WHERE ?

Ну напрмер так:

SELECT * FROM <Table1>, <Table2>
WHERE
 <Table1>.ID = <Table2>.ID


 
Галинка ©   (2008-02-01 14:12) [9]


> Брюнетка ©   (01.02.08 13:53) [5]


да как-то master-detail хватало. Ими и выкручивалась.

clickmaker ©   (01.02.08 12:35) [1]

SELECT COUNT(*) FROM IncomingMails
LEFT JOIN ReadMails
ON IncomingMails.ID=ReadMails.ID
WHERE ReadMails.User_ID=@userid AND ReadMails.ID=@mailid


???


 
Павел Калугин ©   (2008-02-01 14:19) [10]

по моему, в МССКУЛ можно вот так

SELECT COUNT(*)
  FROM IncomingMails,
       ReadMails
WHERE IncomingMails.ID=*ReadMails.ID
  AND ReadMails.User_ID=@userid AND ReadMails.ID=@mailid


 
clickmaker ©   (2008-02-01 14:22) [11]


> [9] Галинка ©   (01.02.08 14:12)

Как определить, что письмо с конкр. ID не прочитано текущим юзером?
а не количество


 
Галинка ©   (2008-02-01 14:30) [12]

если не найдено не одной записи, следовательно оно не прочитано.


 
Kolan ©   (2008-02-01 14:30) [13]

Как определить, что письмо с конкр. ID не прочитано текущим юзером?

SELECT COUNT(*) FROM ReadMails
WHERE (ID = @ID) AND (User_ID = @User_ID)


Странное какое-то задание.


 
Юрий ©   (2008-02-01 14:31) [14]

> [12] Галинка ©   (01.02.08 14:30)

Мда, а ID где его?


 
Romkin ©   (2008-02-01 14:33) [15]

[1] нао бы перефразировать: просто найти все непрочитанные письма :)
Тогда и порочность записи "WHERE IncomingMails.ID=*ReadMails.ID" будет видна :-P


 
Галинка ©   (2008-02-01 14:46) [16]

Юрий ©   (01.02.08 14:31) [14]

чье ID? письма? тогда в параметре @mailid.


 
Kolan ©   (2008-02-01 14:51) [17]

> просто найти все непрочитанные письма

SELECT IncomingMails.ID FROM IncomingMails, ReadMails
WHERE
 IncomingMails.ID = ReadMails.ID


 
Брюнетка ©   (2008-02-01 14:51) [18]

> [7] isasa ©   (01.02.08 14:00)

WHERE форева, остальное - ересь и бред!
-)))


 
Ega23 ©   (2008-02-01 14:52) [19]

Откровенно говоря, за 8 лет работы с БД использовал только Left Join, да и то крайне редко.
Вот Union - это очень часто.


 
Павел Калугин ©   (2008-02-01 15:02) [20]

левые правые объединения вообще вредная штука. если иное явно не прописано в задаче.
то есть если задача стоит выделить в списке всех сообщений прочитаные (или нет) тогда да, левое. а просто отобрать - тогда прямое


 
Romkin ©   (2008-02-01 15:05) [21]

Kolan ©   (01.02.08 14:51) [17] непрочитанные!


 
Юрий ©   (2008-02-01 15:09) [22]

> [16] Галинка ©   (01.02.08 14:46)

Сорри, я прочёл задание как "вернуть ID непрочитанных пользователем писем".


 
Kolan ©   (2008-02-01 15:11) [23]

> непрочитанные!

Тогда так:
SELECT * FROM IncomingMails
WHERE
 ID NOT IN(
   SELECT IncomingMails.ID FROM IncomingMails, ReadMails
   WHERE
    IncomingMails.ID = ReadMails.ID)


 
Romkin ©   (2008-02-01 15:12) [24]

Kolan ©   (01.02.08 15:11) [23] А желательно через join, без подзапроса :)
Задачка такая...


 
Kolan ©   (2008-02-01 15:15) [25]

> А желательно через join

Ну это есть.

> без подзапроса

шас еше попробую&#133


 
Павел Калугин ©   (2008-02-01 15:18) [26]

> [23] Kolan ©   (01.02.08 15:11)

ну тогда уже не IN  a EXISTS


 
Галинка ©   (2008-02-01 15:18) [27]

Romkin ©   (01.02.08 15:12) [24]

тогда можно так:

SELECT * FROM IncomingMails
LEFT JOIN ReadMails
ON IncomingMails.ID=ReadMails.ID
WHERE NOT ReadMails.User_ID=@userid


 
Галинка ©   (2008-02-01 15:20) [28]

Поэтому я и прошу книжку с экспериментальной БД и заданиями. Чтобы все самой пощупать и проверить. Неужели такой нет?


 
Павел Калугин ©   (2008-02-01 15:23) [29]

> [28] Галинка ©   (01.02.08 15:20)

так дали ссылку
там все можно пощупать
и вроде как даже теория есть маленько


 
Галинка ©   (2008-02-01 15:26) [30]

там регистрация нужна ((


 
Kolan ©   (2008-02-01 15:29) [31]

О, так?

SELECT IncomingMails.ID
FROM IncomingMails FULL OUTER JOIN ReadMails
 ON IncomingMails.ID = ReadMails.ID
WHERE ReadMails.ID IS NULL


 
Kolan ©   (2008-02-01 15:30) [32]

> Поэтому я и прошу книжку с экспериментальной БД и заданиями.

Сказали же
http://www.sql-ex.ru

Там и пошупать и теорию прочесть и на форуме обудить &#151; супер тема!


 
Kolan ©   (2008-02-01 15:31) [33]

> там регистрация нужна ((

Ну и регся, не съедят тебя. Регистрация нужна для внутреннего рейтинга. И для того, чтобы ты вопросы решала по порядку.


 
Павел Калугин ©   (2008-02-01 15:34) [34]

> [27] Галинка ©   (01.02.08 15:18)

В принципе оно верно
то есть это все письма кроме тех, которые прочитал пользователь

но так и напрашивается
SELECT * FROM IncomingMails
where not exists(select 1
                  from ReadMails
                 where ReadMails.ID = IncomingMails.ID
                   and ReadMails.User_ID=@userid
                )


 
Romkin ©   (2008-02-01 15:35) [35]

Галинка ©   (01.02.08 15:18) [27] Ну я же просил, вывести ID всех непрочитанных писем :))) Неважно, кем.
Ну откуда здесь USER_ID?
ТЕм более, запрос [27] выдает "письма, прочитанные кем-то, но не данным USER_ID"
В общем, поставлю вопрос более четко:

Есть таблица A(ID integer not null primary key) и такая же таблица B(ID integer not null primary key).
Они как-то заполнены. Вывести с использованием join и без использования подзапроса те значения ID из таблицы A, которых нет в таблице B.

Второй вопрос: имеется таблица сотрудников с указанием иерархии:
create table EMPLOYEE (
ID integer not null,
NAME varchar(120) not null,
OWNER_ID integer,
PRIMARY KEY (ID),
FOREIGN KEY (OWNER_ID) references EMPLOYEE (ID));
Вывести список сотрудников, добавив имя (NAME) непосредственного начальника (он указан в OWNER_ID)

В принципе, этих двух задач достаточно для понимания join.


 
Павел Калугин ©   (2008-02-01 15:36) [36]

> [27] Галинка ©   (01.02.08 15:18)

понял что мне не нравится. если письмо с ID 3 будет прочитано сотней пользователей кроме искомого то сколько раз оно будет присутствовать в списке?


 
Romkin ©   (2008-02-01 15:44) [37]

Kolan ©   (01.02.08 15:29) [31] Почти. Результат верен, но можно просто left join ;)
SELECT IncomingMails.ID
FROM IncomingMails LEFT JOIN ReadMails
ON IncomingMails.ID = ReadMails.ID
WHERE ReadMails.ID IS NULL

Вот тут, кстати, и проявляется недостаток записи соединения из [10] через "*=". Просто потому, что пишется оно во where, а там порядок вычисления выражения не определен.


 
Sandman25   (2008-02-01 16:39) [38]

Ega23 ©   (01.02.08 14:52) [19]

Left Join это частный вид Outer join. Полностью он так и пишется: Left Outer Join :)


 
Sandman25   (2008-02-01 16:40) [39]

И кстати Outer Join и Left Join это одно и то же, два разных способа сократить Left Outer Join


 
Anatoly Podgoretsky ©   (2008-02-01 16:41) [40]

> isasa  (01.02.2008 14:00:07)  [7]

WHERE к OUTER JOIN не имеет отношения.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.033 c
2-1202721542
newbie2
2008-02-11 12:19
2008.03.09
Как сохранить integer размером больше 2-байт в xls?


15-1201875396
Riply
2008-02-01 17:16
2008.03.09
Экономия памяти при работе.


8-1175498564
Jar
2007-04-02 11:22
2008.03.09
Используемый кодек


2-1202890066
arreke
2008-02-13 11:07
2008.03.09
Удалить самого себя


2-1202658365
Kirill
2008-02-10 18:46
2008.03.09
Actions





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский