Соединение SQL, которое находит несоответствия

#sql #tsql #subquery #left-join

#sql #tsql #подзапрос #левое соединение

Вопрос:

У меня есть две таблицы «SellerDetails» и «ANL», и в обеих есть ключевые поля «Номер ссылки продавца» и «Год продажи».

введите описание изображения здесь

Это дает мне информацию о том, где есть совпадение по ссылке продавца No, где год продаж равен «20», а отдел — «Удаленные продажи»

 SELECT si.[Seller Ref No] FROM dbo.SellerDetails AS si, dbo.ANL AS a
WHERE si.[Seller Ref No] = a.[Seller Ref No]
AND si.Department = 'Remote Sales'
AND si.[Sales Year] = '20';
  

Но как мне узнать записи, которые находятся в «SellerDetails», но НЕ в «ANL», где год продаж равен «20», а отдел — «Удаленные продажи»? Я пробовал это, но оно возвращает количество, намного большее, чем я ожидал. Я также пытался изменить ‘=’ на ‘<>’, но это дало худший результат

 SELECT si.[Seller Ref No]
FROM dbo.SellerDetails AS si
LEFT JOIN dbo.ANL AS a ON (si.[Seller Ref No] = a.[Seller Ref No])
WHERE si.Department = 'Remote sales'
AND si.[Sales Year] = '20';
  

Ответ №1:

Вы можете использовать not exists :

 select s.*
from dbo.SellerDetails s
where 
    s.Department = 'Remote Sales'
    and s.[Sales Year] = 20
    and not exists (select 1 from dbo.ANL a where a.[Seller Ref No] = s.[Seller Ref No])
  

Неясно, хотите ли вы также использовать [Sales Year] в качестве условия корреляции: оно присутствует в обеих таблицах, но ваш запрос не использует это отношение. Если вы этого хотите, то:

 select s.*
from dbo.SellerDetails s
where 
    s.Department = 'Remote Sales'
    and s.[Sales Year] = 20
    and not exists (select 1 from dbo.ANL a where a.[Seller Ref No] = s.[Seller Ref No] and a.[Sales Year] = s.[Sales Year])
  

Примечание: вот запрос, который вы, предположительно, хотели написать, используя left join :

 SELECT si.[Seller Ref No]
FROM dbo.SellerDetails AS si
LEFT JOIN dbo.ANL AS a ON si.[Seller Ref No] = a.[Seller Ref No]
WHERE 
    si.Department = 'Remote sales'
    AND si.[Sales Year] = '20'
    AND a.[Seller Ref No] IS NULL
  

Последнее условие в WHERE предложении отфильтровывает совпадающие строки.

Ответ №2:

 SELECT si.[Seller Ref No]
FROM dbo.[SellerDetails] AS   si
LEFT JOIN dbo.[ANL] AS a ON   si.[Seller Ref No] = a.[Seller Ref No]
                     AND   si.[Department] = 'Remote sales'
                     AND   si.[Sales Year] = '20'
Where a.[Seller Ref No] is null