[SQL] помогите с запросом.

noiz_music

Всем привет.
Подскажите, как составить следующий запрос, учитывая то, что вложенных SELECT'ов нет.
Есть две таблицы:

DVD
(id INT PRIMARY KEY,
title VARCHAR(200)
);
TakenItems
(id_user INT,
id_dvd INT
);

Первая таблица сожержит DVD диски DVD-проката, вторая содержит какие диски какими пользователями взяты.
Как составить запрос, чтобы узнать свободные диски, не взятые не одним пользователем? Или по-другому, как вытащить все id из таблицы DVD, которые не содержатся в TakenItems?
Спасибо.

Ikorny

select id from dvd t
where t.id not in (select id_dvd from takenitems)

noiz_music

вложенных SELECT'ов нет
я написал об этом

Ikorny

сорри, не заметил

gopnik1994

select d.id
from dvd d
left join taken t on d.id=t.id_dvd
where t.id_dvd is null

gopnik1994

или щас выяснится, что левых джойнов тоже нет?

kruzer25

Что-то мне подсказывает, что не может быть так, что получить все элементы, удовлетворяющие условию, за один простой селект --- можно, а не удовлетворяющие --- нельзя.
Уже есть пара вариантов, но они достаточно кривые (хотя, вполне возможно, их и выйдет довести до чего-то путного).
---
...Я работаю...

gopnik1994

проверь

noiz_music

Join'ы есть
когда я задавал вопрос я придумал ответ

select
a.*
from DVD a
left outer join TakenItem b on a.id = b.id_dvd
where b.id_dvd is null;

то есть он такой же, как у тебя, но с outer join'ом
что-то мне подсказало, что он будет вернее
а теперь они обадают один и тот же результат
в чем тогда их разница:? и что в данном случае правильнее?
спасибо

gopnik1994

outer в данном случае ровно ничего не значит - это просто повышение читабельности.
существуюет всего 4 типа джойнов (на самом деле три, потому что правый есть зеркальное отражение левого)
"join" == "inner join"
"outer join" == "full join"
"left join" == "left outer join"
"right join" == "right outer join"

psm-home

left join и left outer join - это одно и то же. Слово "внешний" можно опускать.

noiz_music

ура
я так и подумал
спасибо

bars71

На всякий случай, www.sql-ex.ru, очень правильный сайт по изучению SELECT

noiz_music

спасибо )

madik_zxz

outer в данном случае ровно ничего не значит - это просто повышение читабельности.
существуюет всего 4 типа джойнов (на самом деле три, потому что правый есть зеркальное отражение левого)
"join" == "inner join"
"outer join" == "full join"
"left join" == "left outer join"
"right join" == "right outer join"
Бывает еще и cross join

pitrik2

а бывает еще и natural join
см. http://lomeo.livejournal.com/1571.html

bansek

Хм. Что-то имхо многовато джойнов набралоь. Аж 6 =)
Я знаю:
1. cross join aka inner join aka straight join aka join aka , - классическое произведение двух таблиц, каждой строке первой табл. ставится в соответсвие каждая строка второй (в нек. диалектах SQL могут отличаться возможностью/обязательностью наличия условного ON clause)
2. left join aka left outer join - когда всем строкам левой таблицы ставятся в соответствие строки правой, соответствующие условию ИЛИ NULL, если таких строк нет
3. right join aka right outer join - то же, что и п.2 тока меняем слова левый и правый местами
4. natural ... - любой (в нек. диалектах только первый) из вышеперечисленных джойнов, в котором автоматически выставляется условие равенства всех одинаково названных столбцов в обеих таблицах
Итого максимум 4. И то, имхо 4 - не настоящий какой-то
Я что-то упустил?

gopnik1994

NATURAL JOIN есть "...a very useful syntax enhancement because it removes the need to add a WHERE clause for the table join conditions, and make all entries in the WHERE clause only used for result set filtering."
ничего нового оно не вносит, так что джойнов всего три, а все оставльное - вариации на тему.

laki

NATURAL JOIN
да только это ANSI 99. А вот МсСкл 2000 его похоже не поддерживает

bobby

Ты это к чему сказал? =)
Оставить комментарий
Имя или ник:
Комментарий: