#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