Възможно ли е да напишете следния SQL израз като ПЪЛЕН JOIN, вместо да използвате NOT IN?
select * from [user] u
AND u.user_id NOT IN (SELECT user_id FROM job)
Бих искал да направя нещо подобно:
SELECT u.* FROM [user] u
FULL JOIN job uj ON u.user_id = uj.user_id
WHERE uj.user_id IS NULL
Търся да накарам всички потребители, които нямат запис в работната маса, да използват пълна комбинация.
Отговори:
3 за отговор № 1Нямате нужда от FULL OUTER JOIN
, Трябва ти LEFT JOIN
:
select *
from [user] u
left join job uj
on u.user_id = uj.user_id
where uj.user_id IS NULL
А LEFT JOIN
ще върне всички редове от user
независимо дали има или не съответстващ ред в job
таблица.
След това, когато добавите where j.user_id is null
филтърът ще върне всички записи само в user
таблица.
Тук е страхотно визуално обяснение на съединенията който е полезен, когато се опитвате да разберете правилния синтактичен подбор.
Вижте a SQL Fiddle Demo с двете версии на заявката (NOT IN
и LEFT JOIN
), което показва, че и двете връщат едни и същи данни.
2 за отговор № 2
SELECT u.*
FROM [user] u
LEFT JOIN job j on (u.user_id = j.user_id)
WHERE j.user_id is NULL
Защо трябва да използвате ПЪЛЕН JOIN? Горното ви дава това, което търсите.
2 за отговор № 3
Искаш да left outer join
, А full outer join
е малко излишно, защото вероятно uj.user_id
няма да бъде NULL.
Двете заявки са еквивалентни, въпреки че те могат да имат различни планове за изпълнение в зависимост от базата данни.