[SQL SERVER][TSQL]UNION statement

[SQL SERVER][TSQL]UNION statement

看到論壇有個關於 UNION 問題,也讓我聯想到一些問題,自己筆記紀錄備忘。

 

UNION基本規則

image

 

1.固定查詢順序

使用 union all就可以達到該效果(如果沒有特別的需求)

因為 union all 很單純的合併兩個資料表結果為單一結果集(效能也較佳),

而 union 會對合併後的結果集處理刪除重複資料,且也會有排序作業.

 

declare @cars table
(
serial int identity(1,1),
name nvarchar(30),
seat tinyint,
price money,
color nvarchar(20)
)
--新增資料
insert into @cars values
('A',4,101.2,'blue'),
('B',6,151.9,'blue'),
('C',2,349.1,'green'),
('D',4,55.4,'green'),
('E',4,89.9,'yellow'),
('F',6,198.9,'blue'),
('G',6,55,'green')

 

 

image

 

2.查詢執行順序

了解基本查詢執行順序我覺得滿重要的,因為當你看到結果和你所想不同時,

你也才會知道該做那些修正動作.且對於查詢調校來說,這可不能不知道,下面我來簡單模擬一下.

 

需求:依價格大到小,列出藍色和綠色汽車價格各頭兩筆資料(需為單一結果集).

我們先拆開來看藍色和綠色的結果如下:

image

這裡的順序應該不難理解:

1. from @car

2. where

3. order by

4. top

 

現在我得使用 union 合併以符合需求

image

你可以看到使用 union 後,結果和執行順序(先執行 top 作業,在執行 order 作業)大不同

1. from @car

2. where

3. top

4. order by

 

所以在次修改statement如下

;with mytmpA as 
(
select top 2 serial ,name,price,color 
from @cars
where color='blue'
order by price desc
) ,
mytmpB as 
(
select top 2 serial ,name,price,color 
from @cars
where color='green'
order by price desc
) 
select * from mytmpA
union all
select * from mytmpB

 

image 

 

對於查詢執行順序大家有興趣可以閱讀

Inside Microsoft® SQL Server® 2008: T-SQL Querying

這裡我大概擷取部分內容(執行順序需考慮是否有 union)

image

image

image

without union

1. FROM

2. ON

3. OUTER (join)

4. WHERE

5. GROUP BY

6. CUBE | ROLLUP

7. HAVING

8. SELECT

9. DISTINCT

10.ORDER BY

11.TOP

 

 

 

 

參考

UNION (Transact-SQL)

Inside Microsoft® SQL Server® 2008: T-SQL Querying