当我在SQL中执行except和union语句时,我看到一个奇怪的行为。
我有两个桌子
1e500 ** 1e500 ** 1e500
数据看起来像这样
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
我的问题是..在第一个except子句中不应该再有另一行:
oid1 oid2 co
1 11 3
4 44 1
是
Select * from #old
except
Select * from #new
最终查询不应具有3行而不是只有2行,因为并非所有列都相同。
答案 0 :(得分:4)
您似乎认为查询被解释为:
(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
这是查询返回的内容。
这在documentation中有解释:
如果EXCEPT或INTERSECT与其他运算符一起使用, 表达式,它在以下上下文中进行评估 优先级:
括号中的表达式
INTERSECT运算符
EXCEPT和UNION根据它们在表达式中的位置从左到右求值