2014-02-21 32 views
2

簡單的問題關於SQL Server。Sql Server Union所有不獲取所有行

我預計這一查詢:

-- part 1  
select * from table01 
except 
select * from table02 
-- 
union all 
-- part 2 
select * from table02 
except 
select * from table01 

會給我同樣的結果集,如果這樣做的兩個部分和第二部分分開。但是我只從查詢中得到兩行,但是從兩個部分得到兩行。知道爲什麼會發生這種情況會很有趣嗎?

回答

0
Declare @t table(col1 int) 
insert into @t values(1),(2) 

Declare @t1 table(col1 int) 
insert into @t1 values(1),(3) 

1.) select * from @t 
     except 
2.) select * from @t1 
     union all 
3) select * from @t1 
     except 
4) select * from @t 


1) and 2) give 2 
then previos result aand 3 gives 2,1,3 
then again last result and 4) give 3 
so final Result=3 
+0

謝謝。但我應該寫爲 (SELECT * FROM peter01 除了 SELECT * FROM peter02) UNION ALL (SELECT * FROM peter02 除了 SELECT * FROM peter01) – Peter

3

except包含兩個輸入的隱式distinct。可能,你沒有想到。沒有具體的示例數據,很難說出發生了什麼。

SELECT name FROM sys.objects 
EXCEPT 
SELECT name FROM sys.objects WHERE 0=1 

等效於

SELECT DISTINCT name FROM sys.objects 

兩者有相同的執行計劃(包括不同)。