[SQL SERVER][TSQL]UNION statement
看到論壇有個關於 UNION 問題,也讓我聯想到一些問題,自己筆記紀錄備忘。
UNION基本規則
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')
2.查詢執行順序
了解基本查詢執行順序我覺得滿重要的,因為當你看到結果和你所想不同時,
你也才會知道該做那些修正動作.且對於查詢調校來說,這可不能不知道,下面我來簡單模擬一下.
需求:依價格大到小,列出藍色和綠色汽車價格各頭兩筆資料(需為單一結果集).
我們先拆開來看藍色和綠色的結果如下:
這裡的順序應該不難理解:
1. from @car
2. where
3. order by
4. top
現在我得使用 union 合併以符合需求
你可以看到使用 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
對於查詢執行順序大家有興趣可以閱讀
Inside Microsoft® SQL Server® 2008: T-SQL Querying
這裡我大概擷取部分內容(執行順序需考慮是否有 union)
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
參考