使用union排序的問題

2021-09-13 14:50:31 字數 1560 閱讀 4337

背景:

任務管理系統中,任務列表查詢的時候需要在乙個table中盡心如下排序.首先,按照任務狀態,任務狀態是已領取的始終排在前面,其後是各種狀態的任務,這些按照更新時間進行排序.所以首先想到的是將兩個查詢結果集進行排序然後union.但是在這個過程中會出現很多坑,在此進行總結.

(select t.*  from task t where taskstate = '002002'  and t.performerid  =  '13c7c0ae2ff5440880dc572da35722b8'  order by t.createtime desc,substr(t.tasktitle from 1 for 9) asc)

union

( select t.* from task t where taskstate != '002001' and taskstate != '002002' and taskstate != '002005' and t.performerid  =  '13c7c0ae2ff5440880dc572da35722b8'

order by t.updatetime desc,t.createtime desc,substr(t.tasktitle from 1 for 9) asc

)首先,很多帖子說需要在union的兩個子句中需要再查詢一次,嵌乙個select查詢,其實不用使用()同樣可以將order by和union隔離開,多一次結構查詢就多一次效能消耗.

其次,在兩個子句中排好序一旦union順序又亂了,根本不像我們想象的那樣將資料拼裝.解決方法是在兩個子句中加入乙個排序字段,最外層再寫一層查詢.

select * from(

select * from (

select t.* ,00 as sort  from task t where  taskstate = '002002' and t.performerid  =  '13c7c0ae2ff5440880dc572da35722b8'

order by createtime desc ,substr(taskdesc from 1 for 9) asc;

) as table1

union all

select * from 

(select t.* ,11 as sort

from task t

wheretaskstate != '002001' and taskstate != '002002' and taskstate != '002005'  and t.performerid  =  '13c7c0ae2ff5440880dc572da35722b8'

order by updatetime desc ,substr(taskdesc from 1 for 9) asc

) as table2 

) aaa order by sort asc

另外介紹一下,field這個函式,書寫格式為格式: 

order by field(字段,值1,值2,...)

這個函式的意思是按照字段首先排值1,然後排值2,依次排序.這個函式在乙個查詢中可以很方便的使用,顯然我們上面的案例不適用

SQL用了Union後的排序問題

最近使用sql語句進行union查詢,驚奇的發現 sql沒問題,union查詢也沒問題,都可以得到想要的結果,可是在對結果進行排序的時候,卻出問題了。1.union查詢沒問題 sql view plain copy select id username mobile time id as leade...

UNION 查詢中的排序

mssql 不允許在union查詢中使用 order by 因此,當我們需要這種功能的時候,就需要繞一些彎路.比如有一張學生表student 和教師表 teacher 我們要查詢所有的教師學生的姓名和年齡,教師排前面,學生排後面,分別按字母順序,則可能會想寫乙個這樣的sql語句 注意,這個語句只是為...

union的謹慎使用

include using namespace std float float666 myfloat 666 myinteger myinteger 1 return myfloat int main float float666 float666 coutmyinteger也被賦值了,myinte...