sqlserver UNION / UNION ALL 合並查詢


演示使用如下兩張表:

CREATE TABLE #UserInfo (ID INT IDENTITY(1,1),UserAddress NVARCHAR(50),UserName NVARCHAR(50),EntryDate DATETIME)

INSERT INTO #UserInfo
        ( UserAddress, UserName, EntryDate )
VALUES  ( N'北京',N'Joey', '2015-04-12'),
        ( N'上海',N'John', '2013-04-23'),
        ( N'鄭州',N'Mery', '2012-03-17'),
        ( N'深圳',N'Anna', '2014-05-07'),
        ( N'合肥',N'Dave', '2011-01-12'),
        ( N'西安',N'Alex', '2012-03-03')


CREATE TABLE #UserOrder (ID INT IDENTITY(1,1),UserName NVARCHAR(50),Amount INT ,Price float)

INSERT INTO #UserOrder
        ( UserName, Amount, Price )
VALUES  ( N'Joey', 30,200),
        ( N'John', 20,120),
        ( N'Mery', 70,231),
        ( N'Anna', 10,201),
        ( N'Dave', 5,12),
        ( N'Alex', 98,1200)

 

合並查詢的特點

1.合並表中的列的個數、數據類型必須相同或相兼容

--案例1
SELECT UserAddress, UserName, EntryDate FROM #UserInfo
UNION

SELECT Amount, UserName FROM #UserOrder

-----結果 列數個數不相等
消息 205,級別 16,狀態 1,第 33 行
使用 UNION、INTERSECT 或 EXCEPT 運算符合並的所有查詢必須在其目標列表中有相同數目的表達式。
--案例2
SELECT UserAddress, UserName, EntryDate FROM #UserInfo
UNION

SELECT Amount, UserName,Price FROM #UserOrder

------結果,數據類型不相同或不兼容
消息 245,級別 16,狀態 1,第 33 行
在將 nvarchar'北京' 轉換成數據類型 int 時失敗。

保證數據類型相同我們需要進行轉換:

--案例  只是更加清晰理解UNION的使用方法,實際項目此類轉換無意義
SELECT UserAddress, UserName, EntryDate FROM #UserInfo
UNION

SELECT CONVERT(NVARCHAR, Amount), UserName,CONVERT(datetime, Price) FROM #UserOrder

2.UNION 默認去掉重復值。如果允許有重復值,請使用UNION ALL

--案例1
SELECT UserAddress, UserName, EntryDate FROM #UserInfo
UNION

SELECT CONVERT(NVARCHAR, Amount), UserName,CONVERT(datetime, Price) FROM #UserOrder

UNION

SELECT UserAddress, UserName, EntryDate FROM #UserInfo

---結果只有12行,說明去掉重復值了
--案例2,改為UNION ALL 顯示所有
SELECT UserAddress, UserName, EntryDate FROM #UserInfo
UNION ALL

SELECT CONVERT(NVARCHAR, Amount), UserName,CONVERT(datetime, Price) FROM #UserOrder

UNION ALL

SELECT UserAddress, UserName, EntryDate FROM #UserInfo

---結果顯示18行,保留了重復數據

 

3.執行順序與左向右(可 通過列的順序或空格改變結果集的排列順序)

--案例 例如將UserName 放在前面,可以比較下其他列的情況
SELECT UserName,UserAddress,  EntryDate FROM #UserInfo
UNION 

SELECT UserName, CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) FROM #UserOrder
--案例是用空格 排序,可以演示查看結果

SELECT UserName,UserAddress,  EntryDate FROM #UserInfo
UNION 

SELECT ' ', CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) FROM #UserOrder

 

4.可以與SELECT INTO 一起使用,但是INTO 必須放在第一個SELECT 語句中

--案例 只能放在第一個select 中
SELECT UserName,UserAddress,  EntryDate 

Into #InsertTables  

FROM #UserInfo

UNION 

SELECT UserName, CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) 

FROM #UserOrder --結果顯示 插入12條數據

 

5.可以對合並的結果集進行排序,但排序的ORDER BY 必須放在最后一個SELECT 后面,所使用的列名必須是第一個SELECT中出現過的

--案例 排序的ORDER BY 必須放在最后一個SELECT 后面
SELECT UserName,UserAddress,  EntryDate 

FROM #UserInfo

UNION 

SELECT UserName, CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) FROM #UserOrder

 ORDER BY UserName
--案例 如果需要隨機獲取指定數據,參照如下方法

 SELECT* FROM (SELECT TOP 2 UserName,UserAddress,  EntryDate  FROM #UserInfo Order By NewId()) A1
UNION ALL
SELECT* FROM (SELECT TOP 2 UserName, CONVERT(NVARCHAR, Amount) as Amount, CONVERT(datetime, Price)as Price FROM #UserOrder  Order By NewId()) A2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM