Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

Посоветйте книгу по 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.025 c
15-1201851982
ZeroDivide
2008-02-01 10:46
2008.03.09
Влияние работы за компьютером на активность головного мозга


6-1181044210
WebSQLNeederr
2007-06-05 15:50
2008.03.09
Програмно кликнуть на ссылку из ТВебБровзера


11-1185211297
kol tasar&amp;#305;m
2007-07-23 21:21
2008.03.09
kol%mck


2-1202713288
kyn66
2008-02-11 10:01
2008.03.09
Событие считывателя штрихкода


2-1202894259
Washington
2008-02-13 12:17
2008.03.09
Двойной щелчок по "чексу" в CheckListBox e