SQL-Union ALL and Except

4

当我在SQL中执行except和union语句时,出现了奇怪的行为。

我有两个表:

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

我有一个问题..第一个except从句中是否应该再加一行:
Select * from #old
except
Select * from #new

which is

oid1    oid2    co    
   1      11     1

最终查询结果不应该有3行吗?因为并非所有列都相同。

1个回答

8

您似乎认为查询被解释为:

(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 与其他运算符一起在表达式中使用,则在以下优先级上下文中进行评估:
1. 括号中的表达式 2. INTERSECT 运算符 3. 根据它们在表达式中的位置从左到右评估 EXCEPT 和 UNION

2
非常完美,非常感谢。是的,这正是我所理解的,今天学到了新东西。以前不知道那些运算符规则。谢谢! - Sarah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接