Я не думаю, что ваш код возвращает набор результатов, который вы намереваетесь.Я скорее думаю, что вы хотите сделать это:
SELECT *
FROM (
SELECT * FROM tableA
EXCEPT
SELECT * FROM tableB
) AS T1
UNION
SELECT *
FROM (
SELECT * FROM tableB
EXCEPT
SELECT * FROM tableA
) AS T2;
Другими словами, вам нужен набор взаимоисключающих членов.Если это так, вам нужно прочитать о приоритете реляционных операторов в SQL;) А когда у вас есть, вы можете понять, что вышеприведенное можно рационализировать следующим образом:
SELECT * FROM tableA
UNION
SELECT * FROM tableB
EXCEPT
SELECT * FROM tableA
INTERSECT
SELECT * FROM tableB;
FWIW, используя подзапросы (производные таблицы)T1
и T2
), чтобы явно показать (что в противном случае было бы неявным) приоритет реляционного оператора, ваш исходный запрос выглядит следующим образом:
SELECT *
FROM (
SELECT *
FROM (
SELECT *
FROM tableA
EXCEPT
SELECT *
FROM tableB
) AS T2
UNION
SELECT *
FROM tableB
) AS T1
EXCEPT
SELECT *
FROM tableA;
Вышеприведенное можно соотнести с:
SELECT *
FROM tableB
EXCEPT
SELECT *
FROM tableA;
... и я не думаю, что предназначено.