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.合并表中的列的個數(shù)、數(shù)據(jù)類型必須相同或相兼容 --案例1 select UserAddress, UserName, EntryDate from #UserInfo union select Amount, UserName from #UserOrder -----結(jié)果 列數(shù)個數(shù)不相等 消息 205,級別 16,狀態(tài) 1,第 33 行 使用 union、INTERSECT 或 EXCEPT 運算符合并的所有查詢必須在其目標列表中有相同數(shù)目的表達式。 --案例2 select UserAddress, UserName, EntryDate from #UserInfo union select Amount, UserName,Price from #UserOrder ------結(jié)果,數(shù)據(jù)類型不相同或不兼容 消息 245,級別 16,狀態(tài) 1,第 33 行 在將 nvarchar 值 '北京' 轉(zhuǎn)換成數(shù)據(jù)類型 int 時失敗。 保證數(shù)據(jù)類型相同我們需要進行轉(zhuǎn)換: --案例 只是更加清晰理解union的使用方法,實際項目此類轉(zhuǎn)換無意義 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 ---結(jié)果只有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 ---結(jié)果顯示18行,保留了重復數(shù)據(jù) 3.執(zhí)行順序與左向右(可 通過列的順序或空格改變結(jié)果集的排列順序) --案例 例如將UserName 放在前面,可以比較下其他列的情況 select UserName,UserAddress, EntryDate from #UserInfo union select UserName, CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) from #UserOrder --案例是用空格 排序,可以演示查看結(jié)果 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 --結(jié)果顯示 插入12條數(shù)據(jù) 5.可以對合并的結(jié)果集進行排序,但排序的ORDER BY 必須放在最后一個select 后面,所使用的列名必須是第一個select中出現(xiàn)過的 --案例 排序的ORDER BY 必須放在最后一個select 后面 select UserName,UserAddress, EntryDate from #UserInfo union select UserName, CONVERT(NVARCHAR, Amount), CONVERT(datetime, Price) from #UserOrder ORDER BY UserName --案例 如果需要隨機獲取指定數(shù)據(jù),參照如下方法 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 ———————————————————— https://www.cnblogs.com/ankeyliu/p/11340381.html 該文章在 2023/5/29 10:39:17 編輯過 |
相關文章
正在查詢... |