日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sqlserver 查询中使用Union或Union All

發布時間:2023/12/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlserver 查询中使用Union或Union All 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

   在 程序人生網站上 看到了 這篇文章 就收藏了 哈 http://www.ourcodelife.com/article-415-1.html?

?  首先,在程序人生網站上,需要負責任的指出的是在SQL Server查詢中使用Union或Union All后Order by排序無效,我不確認是不是微軟的bug,不過這里卻是我實際編程工作的經驗,但愿大家看到這篇文章后,不要再走彎路,不要再為做一個快樂的程序員而苦惱。

?

下面以可操作性的代碼說明這個bug,權且先認為是bug吧。

?

比如有一張學生表student 和教師表 teacher , 我們要查詢所有的教師學生的姓名和年齡,教師排前面,學生排后面,分別按字母順序,則可能會想寫一個這樣的Sql語句: (注意,這個語句只是為了說明問題,這并不是一個正確的語句)

SELECT Name,Age FROM Teacher ORDER BY Name?
UNION?
SELECT Name,Age FROM Student ORDER BY Name

實際上,MSSQL并不允許我們寫這樣的語句,因此將會報錯 UNION 附近有語法錯誤.

其實我們只需要繞開,讓ORDER BY 和UNION 不在同一層, 讓ORDER 在子查詢內而 UNION 在外面(因為我們要先教師學生分開,然后再名字) 這樣得到了另外一個Sql語句:(注意,這依然不是一個正確的語句)

SELECT * FROM (SELECT Name,Age FROM Teacher ORDER BY Name) A?
UNION?
SELECT * FROM (SELECT Name,Age FROM Student ORDER BY Name) B

這句Sql語句依然無法通過,因為這又觸犯了MSSQL的另外一條語法規定,在子查詢中, 如果不存在TOP語句則ORDER BY子句無效. 但是我們需要的是全部結果,并不需要TOP的功能. 顯然, TOP 100% 是個解決的方法. 因為100%就是全部了.

?

最后,這條蹩腳的Sql語句出爐了:

SELECT * FROM (SELECT TOP 100 PERCENT Name,Age FROM Teacher ORDER BY Name) A?
UNION?
SELECT * FROM (SELECTTOP 100 PERCENT Name,Age FROM Student ORDER BY Name) B

這就是最后的結果, 為了讓ORDER BY 和UNION同時發揮作用,繞了2個彎.

如果想Union前面和后面的集合分開,使用Union all,但要去除重復的記錄。

?

但是在使用Union All的時候需要特別注意,在使用Union All的時候,上面講到的規則,也就是Order by 仍然會失效。

讓程序員朋友們又苦惱了吧,下面的解決方法就是重點了。

Select TOP 99.999999 PERCENT Name,Age FROM Teacher ORDER BY Name

在使用了99.999999這個特殊數字后,該問題最終得到解決 ,真是神奇啊。

?

另外補充一點:UNION和UNION ALL的區別 ,UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。(應該就是這種算法讓程序員自己編碼的Order by排序失效了)。

UNION ALL只是簡單的將兩個結果集進行鏈接返回,所以如果我們只是為了鏈接兩個結果集,只要用UNION ALL就可以了,并且從效率上來說UNION ALL也比UNION快,因為它不需要進行篩選排重的。

轉載于:https://www.cnblogs.com/dragon-L/archive/2013/04/22/3035937.html

總結

以上是生活随笔為你收集整理的sqlserver 查询中使用Union或Union All的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。