Форум: "Прочее";
Текущий архив: 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
Ну это есть.
> без подзапроса
шас еше попробую…
← →
Павел Калугин © (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
Там и пошупать и теорию прочесть и на форуме обудить — супер тема!
← →
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