Подтвердить что ты не робот

SQL:... WHERE X IN (SELECT Y FROM...)

Является следующим наиболее эффективным в SQL для достижения его результата:

SELECT * 
  FROM Customers 
 WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)

Может ли какое-то использование объединений быть лучше и достичь того же результата?

4b9b3361

Ответ 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 раза быстрее). Никогда на самом деле не пытайтесь понять, почему это так, но если вы работаете с большими наборами результатов, такие различия могут возникнуть, если вы не знаете об этом.