SQL:... WHERE X IN (SELECT Y FROM...)
Является следующим наиболее эффективным в SQL для достижения его результата:
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
Может ли какое-то использование объединений быть лучше и достичь того же результата?
Ответы
Ответ 1
Одной из причин, почему вы предпочитаете использовать JOIN
, а не NOT IN
, является то, что если значения в предложении NOT IN
содержат любые NULL
, вы всегда не получают результатов. Если вы используете NOT IN
, помните, чтобы всегда учитывать, может ли подзапрос вернуть значение NULL!
RE: Вопрос в комментариях
'x' NOT IN (NULL, 'a', 'b')
≡ 'x' < > NULL и 'x' < > 'a' и 'x' < > 'Ь'
≡ Неизвестно, True и True
≡ Неизвестно
Ответ 2
Любая достаточно зрелая база данных SQL должна иметь возможность выполнять это так же эффективно, как эквивалент JOIN
. Используйте то, что вам более доступно.
Ответ 3
SELECT Customers.*
FROM Customers
WHERE NOT EXISTS (
SELECT *
FROM SUBSCRIBERS AS s
JOIN s.Cust_ID = Customers.Customer_ID)
При использовании "NOT IN" запрос выполняет вложенные проверки полной таблицы, тогда как для "NOT EXISTS" запрос может использовать индекс в подзапросе.
Ответ 4
Возможно, попробуйте это
Select cust.*
From dbo.Customers cust
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID
Where subs.Customer_Id Is Null
Ответ 5
Если вы хотите узнать, какая из них эффективнее, попробуйте взглянуть на оценочные планы запросов или на реальные планы запросов после выполнения. Он расскажет вам о затратах на запросы (я считаю, что стоимость процессора и ввода-вывода будет интересной). Я бы не удивился, если бы не было никакой разницы, но вы никогда не знаете. Я видел, что некоторые запросы используют несколько ядер на нашем сервере базы данных, а переписанная версия этого же запроса будет использовать только одно ядро (разумеется, запрос, который использовал все 4 ядра, был в 3 раза быстрее). Никогда на самом деле не пытайтесь понять, почему это так, но если вы работаете с большими наборами результатов, такие различия могут возникнуть, если вы не знаете об этом.