ITPub博客

首页 > 数据库 > Oracle > 【解答收藏】表内父子(树)关系的处理 Start with ... connect by

【解答收藏】表内父子(树)关系的处理 Start with ... connect by

原创 Oracle 作者:hansom1029 时间:2010-03-24 09:47:36 0 删除 编辑

有如下数据
CREATE TABLE a
(
aid NUMBER,
aname VARCHAR2(20),
paid NUMBER
)


INSERT INTO a VALUES(1,'中国',NULL);
INSERT INTO a VALUES(2,'北京',1);
INSERT INTO a VALUES(3,'海淀',2);
INSERT INTO a VALUES(4,'1局',3);
INSERT INTO a VALUES(5,'东城',1);
INSERT INTO a VALUES(6,'1局',5);
COMMIT;

想得到下面这样格式的数,请问应该怎么写SQL,谢谢了。
col1 col2 col3 col4
中国 北京 海淀 1局
中国 北京 东城 1局

正解:from ID: newkid

SELECT REGEXP_SUBSTR(p,'[^,]+',1,1) AS col1
,REGEXP_SUBSTR(p,'[^,]+',1,2) AS col2
,REGEXP_SUBSTR(p,'[^,]+',1,3) AS col3
,REGEXP_SUBSTR(p,'[^,]+',1,4) AS col4
FROM (
SELECT SYS_CONNECT_BY_PATH(aname,',') p
FROM a
WHERE CONNECT_BY_ISLEAF=1
START WITH paid IS NULL
CONNECT BY paid = PRIOR aid
);

知识点:

1. START WITH ... CONNECT BY ;

2.无论正树还是倒树, 关键就在于connect by的条件.
正树: 必须是 ‘父’= prior ‘子’
倒树: 必须是 ‘子’= prior ‘父;

3.CONNECT_BY_ISLEAF=1;

4.REGEXP_SUBSTR() 的使用。

[@more@]

有如下数据
CREATE TABLE a
(
aid NUMBER,
aname VARCHAR2(20),
paid NUMBER
)


INSERT INTO a VALUES(1,'中国',NULL);
INSERT INTO a VALUES(2,'北京',1);
INSERT INTO a VALUES(3,'海淀',2);
INSERT INTO a VALUES(4,'1局',3);
INSERT INTO a VALUES(5,'东城',1);
INSERT INTO a VALUES(6,'1局',5);
COMMIT;

想得到下面这样格式的数,请问应该怎么写SQL,谢谢了。
col1 col2 col3 col4
中国 北京 海淀 1局
中国 北京 东城 1局

正解:from ID: newkid

SELECT REGEXP_SUBSTR(p,'[^,]+',1,1) AS col1
,REGEXP_SUBSTR(p,'[^,]+',1,2) AS col2
,REGEXP_SUBSTR(p,'[^,]+',1,3) AS col3
,REGEXP_SUBSTR(p,'[^,]+',1,4) AS col4
FROM (
SELECT SYS_CONNECT_BY_PATH(aname,',') p
FROM a
WHERE CONNECT_BY_ISLEAF=1
START WITH paid IS NULL
CONNECT BY paid = PRIOR aid
);

知识点:

1. START WITH ... CONNECT BY ;

2.无论正树还是倒树, 关键就在于connect by的条件.
正树: 必须是 ‘父’= prior ‘子’
倒树: 必须是 ‘子’= prior ‘父;

3.CONNECT_BY_ISLEAF=1;

4.REGEXP_SUBSTR() 的使用。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8736435/viewspace-1032278/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    4
  • 访问量
    3806