演示使用如下兩張表:
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