Я читал статью, в которой объяснялась разница между предложением join и in и exists, но я смутился объяснением разных результатов при использовании предложения NOT IN vs. NOT EXISTS. Может ли кто-нибудь уточнить, почему существует разница между выводом для предложения NOT EXISTS против предложения NOT IN? Я попытался удалить строку NULL (t2.id = 8) из таблицы t2 и получил тот же результат.JOIN vs. IN vs. EXISTS
Вот SQL скрипт из этой статьи:
CREATE TABLE t1 (id INT, title VARCHAR(20), someIntCol INT)
GO
CREATE TABLE t2 (id INT, t1Id INT, someData VARCHAR(20))
GO
INSERT INTO t1
SELECT 1, 'title 1', 5 UNION ALL
SELECT 2, 'title 2', 5 UNION ALL
SELECT 3, 'title 3', 5 UNION ALL
SELECT 4, 'title 4', 5 UNION ALL
SELECT null, 'title 5', 5 UNION ALL
SELECT null, 'title 6', 5
INSERT INTO t2
SELECT 1, 1, 'data 1' UNION ALL
SELECT 2, 1, 'data 2' UNION ALL
SELECT 3, 2, 'data 3' UNION ALL
SELECT 4, 3, 'data 4' UNION ALL
SELECT 5, 3, 'data 5' UNION ALL
SELECT 6, 3, 'data 6' UNION ALL
SELECT 7, 4, 'data 7' UNION ALL
SELECT 8, null, 'data 8' UNION ALL
SELECT 9, 6, 'data 9' UNION ALL
SELECT 10, 6, 'data 10' UNION ALL
SELECT 11, 8, 'data 11'
А вот запросы SQL и их объяснение:
- IN не получить правильные результаты. - Это связано с тем, как IN обрабатывает NULL и трехзначную логику. - NULL рассматривается как неизвестный, поэтому, если в t2.t1id есть нуль - NOT IN будет возвращать либо НЕ ИСТИННО, либо НЕ НЕИЗВЕСТНО. И ни один из них не может быть ИСТИННЫМ. - когда в столбце t1id таблицы t2 есть NULL, запрос NOT IN всегда возвращает пустой набор.
SELECT t1.*
FROM t1
WHERE t1.id NOT IN (SELECT t1id FROM t2)
- НЕ СУЩЕСТВУЕТ получает правильные результаты
SELECT t1.*
FROM t1
WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id)
GO
DROP TABLE t2
DROP TABLE t1
Вот ссылка на статью: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
Спасибо!
Вот лучшая статья: http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join Кроме того, в чем ваш вопрос? –
@TimSchmelter «Может кто-нибудь уточнить, почему существует разница между выводом для предложения NOT EXISTS против предложения NOT IN?» – Jocke
@Jocke: Но он добавил объяснение позже сам, это сбивает с толку. –