По определению, EXCEPT возвращает отдельные строки путем сравнения результатов двух запросов.
EXCEPT возвращает отдельные строки из левого входного запроса, которые не выводятся правым входным запросом.
Базовые c правила:
- Число и порядок столбцов должны быть одинаковыми во всех запросах.
- Типы данных должны быть совместимы.
CREATE TABLE MyTableA (ColA int, ColB int)
CREATE TABLE MyTableB (ColA int, ColB int)
INSERT INTO MyTableA (ColA, ColB) VALUES (15,1),(10,1),(2,1),(2,1),(16,1),(2,2),(3,3),(3,3)
INSERT INTO MyTableB (ColA, ColB) VALUES (1,1),(1,1),(1,1),(2,2),(4,5),(1,1),(4,5)
GO
SELECT * FROM MyTableA
EXCEPT
SELECT * FROM MyTableB
Select *
from MyTableA as a where not exists (Select 1 from MyTableB as b
where a.ColA = b.ColA and a.ColB = b.ColB)
GO
ColA | ColB
---: | ---:
2 | 1
3 | 3
10 | 1
15 | 1
16 | 1
ColA | ColB
---: | ---:
15 | 1
10 | 1
2 | 1
2 | 1
16 | 1
3 | 3
3 | 3
db <> fiddle здесь
Вы можете видеть, что использование EXCEPT сгенерированных повторяющихся записей, если вы хотите избавиться от этого, вам может потребоваться столбец идентификатора для обеих таблиц и обновить ваш запрос до:
Select *
from MyTableA as a where not exists (Select 1 from MyTableB as b
where a.ColA = b.ColA and a.ColB = b.ColB and a.ID <> b.ID)