Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Наведите на мысль с sql запросом


Автор: Killer_13 4.11.2011, 23:18
Здравств, стараюсь понять что да как.

Конкретики приводить не буду, может кто просто наведет на мысль, буду благодарен.

Значит есть две таблички в одной 2 номера, нужно проверить если в другой табличке есть такие номера, то не выводить ничего, если нету то вывести этот номер.

ТОлько пож у кого есть желание подсказать - без кода! 

Мне нужно самому проникнуться раз и навсегда.

Пасиб.

Автор: sitsalavat 4.11.2011, 23:24
делаешь выборку этого номера по первой таблице, в условии указываешь, что этого номера нет в другой таблице.
получается, если есть - то условию не удовлетворяет и не выберет, в противоположном случае - ваша задача выполнена)

Автор: boevik 5.11.2011, 02:37
чуть конкретнее, то outer join по номеру и условие: вторая_таблица.номер is null.
В итоге получится выборка всех номеров из первой таблицы, которых нет во второй.

Автор: Killer_13 5.11.2011, 02:46
Пасиб, покурю варианты, но наверное уже завтра...
А что вы имеете введу под null если например там только 2 номера, 2 строки, то что третья строка null? Или я вас не правильно понял, или вы меня. 

Автор: Zloxa 5.11.2011, 11:48
boevik, аутер джойн канает как частный случай, когда объединение идет по ключам. Общий случай - семиантиджойн, реализуется через not exists.

Автор: Killer_13 5.11.2011, 14:55
УРя, получилось, пасибо вам,

Вот с NOT EXISTS все работает
Код

SELECT teams.spielernr AS Kapitan_Nr,spieler.name AS Kapitan_Name
FROM teams,spieler
WHERE teams.spielernr=spieler.spielernr AND 
NOT EXISTS
(
SELECT strafen.spielernr
FROM strafen
WHERE strafen.spielernr=teams.spielernr
)


а с JOIN что-то не получилось... :(
Код

SELECT strafen.spielernr AS Kapitan_Nr, spieler.name AS Kapitan_name
FROM spieler,teams JOIN strafen ON strafen.spielernr IS NULL
ORDER BY strafen.spielernr

Автор: tzirechnoy 6.11.2011, 11:11
С JOIN не работает потому, что нужэн outer join. FROM ....,..... LEFT OUTER JOIN strafen ON strafen.spielernr=teams.spielernr
WHERE strafen.spielernr IS NULL

Автор: Killer_13 6.11.2011, 12:35
Переделаю - пасиб, ошибку понял.

Автор: boevik 7.11.2011, 21:56
Цитата(Zloxa @  5.11.2011,  11:48 Найти цитируемый пост)
boevik, аутер джойн канает как частный случай, когда объединение идет по ключам

Что значит только по ключам? Можно делать объединение по любым полям (сейчас мы не обсуждаем эффективность выборки).
Выборка с применением IN (по другому говоря exists) это частный случай так как ограничивает условие только по одном полю.
 

Автор: Akina 7.11.2011, 22:37
Цитата(boevik @  7.11.2011,  22:56 Найти цитируемый пост)
Выборка с применением IN (по другому говоря exists) это частный случай так как ограничивает условие только по одном полю.

СУБД-зависимо... скажем, MySQL совершенно спокойно относится к 
Код

WHERE (f1, f2) IN (SELECT f3, f4 FROM t1)

Автор: Zloxa 8.11.2011, 08:44
Цитата(boevik @  7.11.2011,  21:56 Найти цитируемый пост)
Что значит только по ключам?

Да, был не прав, в отличии от семидожйна, в случае антиджойна, ключи - не решают.  smile 

Цитата(boevik @  7.11.2011,  21:56 Найти цитируемый пост)
Выборка с применением IN (по другому говоря exists) это частный случай так как ограничивает условие только по одном полю. 

1) Речь шла о not exists. А not in эквивалентен not exists'у лишь в частном случае, когда антиджойн происходит по non nullable полям.
2) Как уже верно заметил Akina, ограничение условия по одному полю в not in - частный случай платформенного ограничения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)