oracle 邻接模型,【原创】MySQL 模拟Oracle邻接模型树形处理
數據庫對層次結構的處理模型有好多種,可以根據自己的需求來設計模型,當然最簡單的也是最容易設計的模型就是所謂的鄰接模型。在這方面,其他數據庫比如Oracle提
數據庫對層次結構的處理模型有好多種,可以根據自己的需求來設計模型,,當然最簡單的也是最容易設計的模型就是所謂的鄰接模型。在這方面,其他數據庫比如Oracle 提供了現成的分析方法 connect by,而MySQL在這方面就顯得有些薄弱了。 不過可以用MySQL的存儲過程實現ORACLE類似的分析功能
這樣,先來創建一個簡單的數表。create table country ( id number(2) not null, name varchar(60) not null);
create table country_relation (id number(2), parentid number(2));
插入一些數據-- Table country.
insert into country (id,name) values (0,'Earth');
insert into country (id,name) values (2,'North America');
insert into country (id,name) values (3,'South America');
insert into country (id,name) values (4,'Europe');
insert into country (id,name) values (5,'Asia');
insert into country (id,name) values (6,'Africa');
insert into country (id,name) values (7,'Australia');
insert into country (id,name) values (8,'Canada');
insert into country (id,name) values (9,'Central America');
insert into country (id,name) values (10,'Island Nations');
insert into country (id,name) values (11,'United States');
insert into country (id,name) values (12,'Alabama');
insert into country (id,name) values (13,'Alaska');
insert into country (id,name) values (14,'Arizona');
insert into country (id,name) values (15,'Arkansas');
insert into country (id,name) values (16,'California');-- Table country_relation.
insert into country_relation (id,parentid) values (0,NULL);
insert into country_relation (id,parentid) values (2,0);
insert into country_relation (id,parentid) values (3,0);
insert into country_relation (id,parentid) values (4,0);
insert into country_relation (id,parentid) values (5,0);
insert into country_relation (id,parentid) values (6,0);
insert into country_relation (id,parentid) values (7,0);
insert into country_relation (id,parentid) values (8,2);
insert into country_relation (id,parentid) values (9,2);
insert into country_relation (id,parentid) values (10,2);
insert into country_relation (id,parentid) values (11,2);
insert into country_relation (id,parentid) values (12,11);
insert into country_relation (id,parentid) values (13,11);
insert into country_relation (id,parentid) values (14,11);
insert into country_relation (id,parentid) values (15,11);
insert into country_relation (id,parentid) values (16,11);
在Oracle 里面,對這些操作就比較簡單了,都是系統提供的。
比如下面四種情形:
1). 查看深度,select max(level) "level" from COUNTRY_RELATION a start with a.parentid is NULL
connect by PRIOR a.id = a.PARENTID
order by level;
level
----------
4
已用時間: 00: 00: 00.03
2). 查看葉子節點select name from
(
select b.name, connect_by_isleaf "isleaf"
from COUNTRY_RELATION a inner join country b on (a.id = b.id)
start with a.parentid is NULL connect by prior a.id = a.PARENTID
) T where T."isleaf" = 1;
NAME
--------------------------------------------------
Canada
Central America
Island Nations
Alabama
Alaska
Arizona
Arkansas
California
South America
Europe
Asia
Africa
Australia
已選擇13行。
已用時間: 00: 00: 00.01
3) 查看ROOT節點select connect_by_root b.name
from COUNTRY_RELATION a inner join country b on (a.id = b.id)
start with a.parentid is NULL connect by a.id = a.PARENTID
CONNECT_BY_ROOTB.NAME
--------------------------------------------------
Earth
已用時間: 00: 00: 00.01
4). 查看路徑select sys_connect_by_path(b.name,'/') "path"
from COUNTRY_RELATION a inner join country b on (a.id = b.id)
start with a.parentid is NULL connect by prior a.id = a.PARENTID
order by level,a.id;
path
--------------------------------------------------
/Earth
/Earth/North America
/Earth/South America
/Earth/Europe
/Earth/Asia
/Earth/Africa
/Earth/Australia
/Earth/North America/Canada
/Earth/North America/Central America
/Earth/North America/Island Nations
/Earth/North America/United States
/Earth/North America/United States/Alabama
/Earth/North America/United States/Alaska
/Earth/North America/United States/Arizona
/Earth/North America/United States/Arkansas
/Earth/North America/United States/California
已選擇16行。
已用時間: 00: 00: 00.01
接下來我們看看在MySQL 里面如何實現上面四種情形:
前三種都比較簡單,可以很容易寫出SQL。
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!
總結
以上是生活随笔為你收集整理的oracle 邻接模型,【原创】MySQL 模拟Oracle邻接模型树形处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux卸载pip的命令(linux卸
- 下一篇: 按主键更新另一个表oracle,SQL根