2016-08-26 25 views
3

假設我有2個結果集(2個查詢)。使用EXCEPT或INTERSECT僅顯示不匹配的行

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結合起來,但是沒有太多運氣的概念。

回答

2

我想你應該能夠得到你需要使用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) 
0

這就像XOR操作:

DECLARE @Table1 TABLE(Name nvarchar(20), Value decimal) 
DECLARE @Table2 TABLE(Name nvarchar(20), Value decimal) 

INSERT INTO @Table1 
VALUES 
(N'field1', 20.00), 
(N'field2', 13.00), 
(N'field3', 4.00) 


INSERT INTO @Table2 
VALUES 
(N'field1', 20.00), 
(N'field2', 14.00), 
(N'field3', 6.00) 


SELECT * 
FROM 
(
    SELECT * 
    FROM @Table1 AS t 
    EXCEPT (SELECT * FROM @Table2 AS t) 
) AS a 
UNION 
SELECT * 
FROM 
(
    SELECT * 
    FROM @Table2 AS t 
    EXCEPT (SELECT * FROM @Table1 AS t) 
) AS b 
0

根據你的文章,你已經嘗試了INTERSECT,UNION和EXCEPT組合,但沒有得到輸出。

嘗試使用(INTERSECT,UNION和EXCEPT)來獲取它。

DECLARE @Table1 TABLE(Name nvarchar(20), Value decimal(18,2)) 
DECLARE @Table2 TABLE(Name nvarchar(20), Value decimal(18,2)) 

INSERT INTO @Table1 
VALUES 
(N'field1', 20.00), 
(N'field2', 13.00), 
(N'field3', 4.00) 


INSERT INTO @Table2 
VALUES 
(N'field1', 20.00), 
(N'field2', 14.00), 
(N'field3', 6.00) 

select *From @Table1 
union 
select *From @Table2 
except 
select *From @Table1 
intersect 
select *From @Table2