1。連環多表外聯接
select *
from circuit c,device d,resgroup g,
portinfo p,devaddr a,device b,devaddr ba
where c.circuitid='$cirid'
and (c.changetype=0 or c.changetype=-1)
and c.adeviceid=d.deviceid
and d.changetype=0
and c.bdeviceid=b.deviceid(+)
and (b.changetype=0 or b.changetype is null)
and c.circuitid=g.resid(+)
and c.adeviceid=p.deviceid(+)
and c.aintdescr=p.portdescr(+)
and p.deviceid=a.deviceid(+)
and p.portdescr=a.intdescr(+)
and (a.changetype=0 or a.changetype is null)
and c.bdeviceid=ba.deviceid(+)
and c.bintdescr=ba.intdescr(+)
and (ba.changetype=0 or ba.changetype is null)
體現出的外連線關係
c=b(+)
c=g(+)
c=ba(+)
c=p(+)
p=a(+)
即最後得出由c決定的外聯接大表:[[[[(a(+)=p](+)=c]=b(+)]=g(+)]=ba(+)
不能忽略的一點,即外聯接有由 on 決定的外聯接條件以及由where決定的select條件
得到的修改語句為:
select *
from device d,
devaddr a right join portinfo p
on p.deviceid=a.deviceid and p.portdescr=a.intdescr
and a.changetype=0
right join circuit c
on c.adeviceid=p.deviceid and c.aintdescr=p.portdescr
left join device b
on c.bdeviceid=b.deviceid
and b.changetype=0
left join resgroup g
on c.circuitid=g.resid
left join c.bdeviceid=ba.deviceid and c.bintdescr=ba.intdescr
and ba.changetype=0
where c.circuitid='$cirid'
and (c.changetype=0 or c.changetype=-1)
and c.adeviceid=d.deviceid and d.changetype=0
外聯接的關鍵是方向性
a left join b on ……,a=b(+)保留a的所有行,b中不匹配的設為null
以及連線條件和where條件
2. 外聯接的 or is null 含義
a.comid = b.comid(+) 表示: b.comid = a.comid or b.comid is null
外聯接與group by 聯合使用 :
表間關係:
prov 存有各省及全國中心公司的id、名稱
city 存有各省下子公司,及中心公司id、名稱
二者關聯關係:c.mortherid = p.comid
a表在規定時間段內可能沒有關於某comid的投訴,所以應用外聯接,所有與a表有關的字段都要進行外聯接
sql中以 a.iptypeid 分組,( 1 =>動態 2 => 靜態
)
以p.comid分組,某個省(如湖北)下的某個地市可能沒有投訴,故在應用外聯接時有a.iptypeid is null 的情況 ,所以分組結果為 iptype = 1 ,iptype =2 iptype is null 三種情況
sql :
select p.compid,
p.compname,
a.iptypeid,
count(a.sequencenum)
from prov p,
city c,
where c.mothercompid = p.compid and
c.compid = a.compid(+) and
to_char(a.sendtime(+),'yyyymmdd') between '20070201' and '20070209'
group by p.compid,p.compname,a.iptypeid
order by p.compid,p.compname,a.iptypeid
結果如下:
comid comname iptype countnum
1 ct00000 中國電信集團中心 1 2
2 ct00012 江蘇電信 1 1
3 ct00012 江蘇電信 0
4 ct00030 湖北電信 1 9
5 ct00030 湖北電信 2 6
6 ct00030 湖北電信 0
7 ct00064 安徽電信 0
8 ct00065 北京電信 0
9 ct00067 福建電信 0
10 ct00087 河北電信 0
SQL中內聯接與外聯接小結
內聯接與外聯接的區別通過例項來說明是最清楚的了,下面先準備好測試環境 create database test go create table t1 deptid int,uname char 10 create table t2 deptid int,memo char 50 insert int...
外聯接查詢
這一篇文章要總結的是用得最多的聯接查詢即外聯接查詢,外聯接查詢相對於交叉聯接和內聯接來說要更複雜一些,我準備從以下幾個方面對外聯接進行總結。1,什麼是外聯接查詢 2,乙個外聯接查詢的例子 3,關於外聯接查詢的總結 外聯接除了有內聯接的兩個邏輯處理步驟 即笛卡爾積和on過濾 之外,還多加乙個外聯接特有...
資料庫內聯接 左外聯接 右外聯接和全聯接
首先給出兩張表用於之後的舉例 stuno stuname gradeid 1001張三1 1002李四2 1003王五3 1004 西楚霸王 1000 gradeid grade 1一年級 2二年級 3三年級 4四年級 顯示結果為符合條件的多個表間的交集。例 select from grade g,...