sql union基礎(chǔ):
union 操作符用于合并兩個(gè)或多個(gè)select語句的結(jié)果集
union內(nèi)部的select語句必須擁有相同數(shù)量的列冯事。列也必須擁有相同數(shù)量的列血公。列也必須擁有相似的數(shù)據(jù)類型。同時(shí)每條select語句中的列的順序必須相同
語法
select * from table1 union select * from table 2
oracle 偽表 dual摔笤,oracle用作select語句的完整
當(dāng)然我們也可以將dual設(shè)定為自己想要值吕世。
開發(fā)中遇到需求命辖,需要對數(shù)據(jù)庫的某個(gè)時(shí)間字段進(jìn)行分類統(tǒng)計(jì)分蓖。語句如下
select count(*) sumNumber,sum(LOANABLEAREA) totalArea,rqjg from ( "
?select T.RID,T.ORGID, T.LOANABLEAREA,T.ENDTIME,case when months_between(t.endtime,sysdate)<=0 then '已到期'
?when months_between(t.endtime,sysdate)<=3 then '三個(gè)月內(nèi)'
?when months_between(t.endtime,sysdate)<=6 then '半年內(nèi)'
when months_between(t.endtime,sysdate)<=12 then '一年內(nèi)' else '其他' end rqjg
from HOUSELOANINFO T ) of2? group by? rqjg
//統(tǒng)計(jì)不同時(shí)間段內(nèi)的總數(shù)和面積
遇到一個(gè)展示問題,如果光用上述語句去查詢终娃,當(dāng)數(shù)據(jù)庫里沒有符合條件的數(shù)據(jù)午磁,返回的結(jié)果鍵值對里便沒有這個(gè)值(比如沒有三個(gè)月內(nèi)的數(shù)據(jù),返回結(jié)果rqjg就沒有這個(gè)字段了)昧辽,而返回的結(jié)果需要補(bǔ)充這個(gè)默認(rèn)值登颓。除了在代碼中進(jìn)行空判斷外, 還可以用union 偽表 dual的方式解決咕痛。
語句修改如下
select sum(t2.sumnumber) sumnumber , sum(t2.totalArea) totalArea , t2.rqjg from?
(select? count(*) sumNumber,sum(LOANABLEAREA) totalArea,rqjg from (?
?select T.RID,T.ORGID, T.LOANABLEAREA,T.ENDTIME,case when months_between(t.endtime,sysdate)<=0 then '已到期'
?when months_between(t.endtime,sysdate)<=3 then '三個(gè)月內(nèi)'
?when months_between(t.endtime,sysdate)<=6 then '半年內(nèi)'
?when months_between(t.endtime,sysdate)<=12 then '一年內(nèi)' else '其他' end rqjg
?from HOUSELOANINFO T ) of2? group by? rqjg?
?union? select? 0 sumnumber,0.0 totalArea,'已到期' rqjg from? dual
?union? select? 0 sumnumber,0.0 totalArea,'三個(gè)月內(nèi)' rqjg from dual
?union select 0 sumnumber,0.0 totalArea,'半年內(nèi)' rqjg from dual?
?union select? 0 sumnumber,0.0 totalArea,'一年內(nèi)' rqjs from dual
?union select 0 sumnumber,0.0 totalArea,'一年以上' rqjs from dual)
?t2 group by t2.rqjg
加入一個(gè)偽表茉贡,可以將原表的結(jié)果和偽表合并起來者铜,將各列加起來就能得到一個(gè)有默認(rèn)值的結(jié)果集放椰。(如下圖)
這樣就利用oracle的特性偽表dual解決了這個(gè)問題