最近使用SQL語句進行UNION查詢,驚奇的發現:SQL沒問題,UNION查詢也沒問題,都可以得到想要的結果,可是在對查出的結果進行union的時候,卻出問題了(人要爆炸)。
from table_02
where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
order by ZBID,HC;

sql2:
from table_03
where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
order by ZBID,HC;

然后呢業務需求是需要把這兩個查詢的結果union all(不使用union的原因是業務上不去掉重復數據)到一起,且數據的順序不能變動
正確的結果應該是這樣的 圖1
然而當你寫這個SQL的時候,select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC
union all
select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC
哎,報錯了,神奇不!哈哈哈。Incorrect usage of UNION and ORDER BY : UNION和ORDER BY的用法不正確
如圖
解決方法:在要union的查詢用()(英文括號括住),例如
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)
結果如下
圖2
SQL沒有報錯是有結果的,不知有沒有發現其實數據的順序其實發生了變化的,注意圖1和圖2第二條數據,哎發現了吧,是不對了吧。那我就要說對不起了,不行查出的結果不滿足我的需求(此時心中一萬只草泥馬奔馳而過),難道這個問題無解嗎?
別慌,有的。
①(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)
但是有沒有發現什么limit,對 你沒有看錯就是他,但是這種寫法有局限性limit的條數有限。你不會說我可以增大limit的條數,你可以試試我不介意,等到數據量大的時候你就知道了
下面說下我采用的解決方法
select a.*
from (
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,0 as PAIXU
from table_02
where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
order by ZBID,HC)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,1 as PAIXU
from table_03
where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
order by ZBID,HC)
) a
order by a.PAIXU,a.ZBID,a.HC;
有沒有發現多了什么,就是它——“PAIXU”列,用它來給sql1和sql2的查詢結果先排序,然后在按照sql1和sql2取數據的時候的字段排序(當然了至於是 asc 還是desc 那就看實際需求了),好就這樣了。
悄悄說下我的“0 as PAIXU”和“1 as PAIXU”是用程序生成出來的