有一張地區市的表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...