SQL联合ALL和Except

时间:2018-08-01 19:55:56

标签: sql union sql-except

当我在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行,因为并非所有列都相同。

1 个答案:

答案 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与其他运算符一起使用,   表达式,它在以下上下文中进行评估   优先级:

     
      
  1. 括号中的表达式

  2.   
  3. INTERSECT运算符

  4.   
  5. EXCEPT和UNION根据它们在表达式中的位置从左到右求值

  6.