SQL-союз ВСЕ и кроме
Я вижу странное поведение, когда я делаю операторы кроме и в SQL.
У меня две таблицы
Select * from #old
Данные выглядят так
oid1 oid2 co
1 11 1
2 22 1
3 33 1
4 55 1
Select * from #new
nid1 nid2 co
1 11 3
2 22 1
3 33 1
4 44 1
4 55 1
Это мой последний запрос
Select * from #old
except
Select * from #new
union all
Select * from #new
except
Select * from #old
и дает эти записи
oid1 oid2 co
1 11 3
4 44 1
Вопрос, который у меня есть... Разве в этой строке не должно быть еще одной строки, кроме предложения:
Select * from #old
except
Select * from #new
который
oid1 oid2 co
1 11 1
Если в конечном запросе не 3 строки, а только 2, то не все столбцы одинаковы.
1 ответ
Вы, кажется, думаете, что запрос интерпретируется как:
(Select * from #old
except
Select * from #new
)
union all
(Select * from #new
except
Select * from #old
)
Но нет. Это интерпретируется как:
((Select * from #old
except
Select * from #new
)
union all
Select * from #new
)
except
Select * from #old
Это эквивалентно:
Select * from #new
except
Select * from #old
это то, что возвращает ваш запрос.
Это объясняется в документации:
Если EXCEPT или INTERSECT используются вместе с другими операторами в выражении, оно оценивается в контексте следующего приоритета:
Выражения в скобках
ИНТЕРСЕКТ оператор
EXCEPT и UNION оцениваются слева направо на основе их положения в выражении