sql-server – 使用EXCEPT或INTERSECT仅显示不匹配的行

假设我有2个结果集(2个查询).

FIELDNAME   VALUE
field1      20.00
field2      13.00
field3      4.00

FIELDNAME   VALUE
field1      20.00
field2      14.00
field3      6.00

我知道query1 EXCEPT query2应该给出

FIELDNAME   VALUE
field2      13.00
field3      4.00

但我真正想要的是从查询的两边显示任何存在差异的情况:

FIELDNAME   VALUE
field2      13.00
field3      4.00
field2      14.00
field3      6.00

那可能吗?我想我可以在一个临时表中做一个SELECT UNION.然后删除任何NOT EXISTS字段名不同的行.还有什么更简单的吗?

看起来我可以将INTERSECT,UNION和EXCEPT以某种方式结合起来并以此结束,但没有太多的运气概念化.

最佳答案 我认为你应该能够通过两次使用EXCEPT并在结果上使用UNION ALL来获得所需内容:

-- records from the table1 that are not in table2
(SELECT * FROM table1 
EXCEPT 
SELECT * FROM table2)

UNION ALL

-- records from the table2 that are not in table1
(SELECT * FROM table2 
EXCEPT 
SELECT * FROM table1)

其他方法是使用UNION获取所有表的组合,然后使用EXCEPT消除所有相交记录:

-- Union of both tables
(SELECT * FROM table1 
UNION ALL
SELECT * FROM table2)

EXCEPT   -- Exclude the records ...

-- ... that are in both tables
(SELECT * FROM table1 
INTERSECT 
SELECT * FROM table2)
点赞