union組合結(jié)果集時(shí)的order問題
更新時(shí)間:2009年09月17日 21:56:40 作者:
如果能確定各查詢結(jié)果不會(huì)有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。
近日,在一個(gè)項(xiàng)目中用到union組合兩個(gè)select結(jié)果,調(diào)試sql時(shí)總是報(bào)錯(cuò),所報(bào)錯(cuò)誤也只是說在union附近有問題,因?yàn)閟ql中用到了group,我想也許是union不支持吧,由于時(shí)間緊,就先在程序中做了合并處理。但程序員對(duì)于代碼的完美性要求總是不能放棄的,所以,常常會(huì)有如鯁在喉的感覺,不搞明白心里會(huì)不舒服。
仔細(xì)查看了MS的在線幫助,在有關(guān)UNION的描述中找到這樣一段說明:
如果使用 UNION 運(yùn)算符,那么各個(gè) SELECT 語句不能包含它們自己的 ORDER BY 或 COMPUTE 子句。而只能在最后一個(gè) SELECT 語句的后面使用一個(gè) ORDER BY 或 COMPUTE 子句;該子句適用于最終的組合結(jié)果集。只能在各個(gè) SELECT 語句中指定 GROUP BY 和 HAVING 子句。
在這段說明中并沒有說union不能用于group,而是說在各個(gè)Select中不能包含order by,而在我的語句中恰恰就有這個(gè),看來是我猜錯(cuò)了。試了一下把order去掉,果然不會(huì)報(bào)錯(cuò)了。也就是說,使用union的時(shí)候,各查詢group是可以的,但不能order或compute。那如果說非要group,有沒有辦法呢?正常情況下只能在最后使用,而且是針對(duì)組合后的結(jié)果集進(jìn)行排序的,而我剛才所說的group,就不能用于最終結(jié)果集,而只能用于每個(gè)查詢。
這是正常的用法,有些人想在每個(gè)查詢中先排序,然后再union,也有非正常的用法,類似:
select * from (select a from [table] order by a) union ...
另外,union后面還可以加上all,在默認(rèn)情況下,union時(shí)會(huì)刪除重復(fù)的項(xiàng),如果加上all則不進(jìn)行篩選,組合所有的結(jié)果。如果能確定各查詢結(jié)果不會(huì)有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。
仔細(xì)查看了MS的在線幫助,在有關(guān)UNION的描述中找到這樣一段說明:
如果使用 UNION 運(yùn)算符,那么各個(gè) SELECT 語句不能包含它們自己的 ORDER BY 或 COMPUTE 子句。而只能在最后一個(gè) SELECT 語句的后面使用一個(gè) ORDER BY 或 COMPUTE 子句;該子句適用于最終的組合結(jié)果集。只能在各個(gè) SELECT 語句中指定 GROUP BY 和 HAVING 子句。
在這段說明中并沒有說union不能用于group,而是說在各個(gè)Select中不能包含order by,而在我的語句中恰恰就有這個(gè),看來是我猜錯(cuò)了。試了一下把order去掉,果然不會(huì)報(bào)錯(cuò)了。也就是說,使用union的時(shí)候,各查詢group是可以的,但不能order或compute。那如果說非要group,有沒有辦法呢?正常情況下只能在最后使用,而且是針對(duì)組合后的結(jié)果集進(jìn)行排序的,而我剛才所說的group,就不能用于最終結(jié)果集,而只能用于每個(gè)查詢。
這是正常的用法,有些人想在每個(gè)查詢中先排序,然后再union,也有非正常的用法,類似:
select * from (select a from [table] order by a) union ...
另外,union后面還可以加上all,在默認(rèn)情況下,union時(shí)會(huì)刪除重復(fù)的項(xiàng),如果加上all則不進(jìn)行篩選,組合所有的結(jié)果。如果能確定各查詢結(jié)果不會(huì)有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。
相關(guān)文章
SQLSERVER2022創(chuàng)建用戶的圖文教程
用戶是數(shù)據(jù)庫中的實(shí)體,用于控制對(duì)數(shù)據(jù)庫對(duì)象的訪問權(quán)限,本文主要介紹了SQLSERVER2022創(chuàng)建用戶的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
SQL Server 聚焦存儲(chǔ)過程性能優(yōu)化、數(shù)據(jù)壓縮和頁壓縮提高IO性能方法(一)
這篇文章主要介紹了SQL Server 聚焦存儲(chǔ)過程性能優(yōu)化、數(shù)據(jù)壓縮和頁壓縮提高IO性能方法(一),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
詳解SQL Server數(shù)據(jù)庫狀態(tài)和文件狀態(tài)
本文通過實(shí)例給大家詳解sqlserver數(shù)據(jù)庫狀態(tài) (database states) 和文件狀態(tài) (database states),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09
SQL將一個(gè)表中的數(shù)據(jù)插入到另一個(gè)表中的方法
這篇文章介紹了SQL將一個(gè)表中的數(shù)據(jù)插入到另一個(gè)表中的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
SQL?server配置ODBC數(shù)據(jù)源(本地和服務(wù)器)詳細(xì)步驟
ODBC是open database connect的縮寫,意思是開放式數(shù)據(jù)庫連接,下面這篇文章主要給大家介紹了關(guān)于SQL?server配置ODBC數(shù)據(jù)源(本地和服務(wù)器)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
SQL?Server安裝后本地服務(wù)器連接失敗的解決方法(僅供參考)
訪問SQLServer數(shù)據(jù)庫失敗時(shí),最常見的錯(cuò)誤是"連接服務(wù)器失敗,SQLServer不存在或訪問被拒絕",或者"未能建立與(local)的鏈接,SQLServer不存在或訪問被拒絕",這篇文章主要給大家介紹了關(guān)于SQL?Server安裝后本地服務(wù)器連接失敗的解決方法,需要的朋友可以參考下2023-11-11
詳解SQL Server表和索引存儲(chǔ)結(jié)構(gòu)
這篇文章主要介紹了詳解SQL Server表和索引存儲(chǔ)結(jié)構(gòu),有助于大家對(duì)SQL存儲(chǔ)方式有深入的理解,參考學(xué)習(xí)下吧。2017-11-11

