SQL練習題二 按等級顯示,遞迴鑽取

2021-10-14 02:47:41 字數 3183 閱讀 8948

有一張地區市的表table2,如圖

要得到如下結果:

一、表table2的建立資料

create

table table2(

id int

,name varchar(15

),parentid int);

insert

into table2 values(1

,'北京市',0

);insert

into table2 values(2

,'廣東省',0

);insert

into table2 values(3

,'昌平區',1

);insert

into table2 values(4

,'海淀區',1

);insert

into table2 values(5

,'廣州市',2

);insert

into table2 values(6

,'深圳市',2

);insert

into table2 values(7

,'沙河鎮',3

);insert

into table2 values(8

,'中關村',4

);insert

into table2 values(9

,'天河區',5

);insert

into table2 values(10

,'福田區',6

);

二、實現1.通用

select

a.name 一級地名

,b.name 二級地名

,c.name **地名

from table2 a

join table2 b on a.id=b.parentid

join table2 c on b.id=c.parentid

2.用with as

with t1 as

(select a.id,a.name,a.parentid

from table2 a

where parentid=0)

,t2 as

(select b.id,b.name,b.parentid

from table2 b

join t1 on b.parentid=t1.id),

t3 as

(select c.id,c.name,c.parentid

from table2 c

join t2 on c.parentid=t2.id

)select

t1.name 一級地名

,t2.name 二級地名

,t3.name **地名

from t1

join t2 on t1.id=t2.parentid

join t3 on t2.id=t3.parentid

3.postgresql資料庫

with recursive t1 as

(select id,name,parentid,1as

level

from table2 where parentid=

0union

allselect t.id,t.name,t.parentid,t1.

level+1

aslevel

from table2 t

join t1 on t.parentid=t1.id

)select

a.name 一級地名

,b.name 二級地名

,c.name **地名

from

(select

*from t1 where

level=1

) ajoin

(select

*from t1 where

level=2

) b on a.id=b.parentid

join

(select

*from t1 where

level=3

) c on b.id=c.parentid

4.oracle資料庫

with t1 as

(select a.*,

level

as code

from table2 a

start

with a.parentid =

0connect

by prior a.id = a.parentid

order

by code,a.id

)select

b.name 一級地名

,c.name 二級地名

,d.name **地名

from

(select

*from t1 where code =

1) b

join

(select

*from t1 where code =

2) c on c.parentid = b.id

join

(select

*from t1 where code =

3) d on d.parentid = c.id

三、總結:遇到樹形結構的資料時,oracle可以使用層次化查詢connect by遍歷表資料,而在postgresql資料庫中,我們使用recursive引數配合with查詢來實現遍歷。還有其他方法的小夥伴歡迎來分享。

SQL趣味練習題

第一中情況 create table renwu name varchar 20 not null,fahter varchar 20 insert into renwu values 小甲 大甲 insert into renwu values 大甲 老甲 insert into renwu na...

SQL基礎練習題

sql 基礎入門50題 1.選擇分數介於85 100,70 85,60 70,0 60分數段之間的人數,課程標號,課程名稱和所佔百分比 select distinct f.c name,a.c id,b.85 100 b.百分比,c.70 85 c.百分比,from score a left joi...

python練習題(二)

1.企業發放的獎金根據利潤提成。利潤 i 低於或等於10萬元時,獎金可提10 利潤高 於10萬元,低於20萬元時,低於10萬元的部分按10 提成,高於10萬元的部分,可可提 成7.5 20萬到40萬之間時,高於20萬元的部分,可提成5 40萬到60萬之間時高於 40萬元的部分,可提成3 60萬到10...