外聯接小結

2021-06-15 21:12:32 字數 3160 閱讀 2074

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,...