一条sql怎么查出单表中含有父子关系的数据呢?
WITH tab AS (
SELECT
'1' AS id,
'0' AS parid,
'广东' AS name
FROM
dual UNION
SELECT
'2' AS id,
'0' AS parid,
'广西' AS name
FROM
dual UNION
SELECT
'3' AS id,
'1' AS parid,
'广州' AS name
FROM
dual UNION
SELECT
'4' AS id,
'3' AS parid,
'荔湾区' AS name
FROM
dual UNION
SELECT
'5' AS id,
'3' AS parid,
'黄浦区' AS name
FROM
dual UNION
SELECT
'6' AS id,
'2' AS parid,
'桂林' AS name
FROM
dual UNION
SELECT
'7' AS id,
'6' AS parid,
'阳朔' AS name
FROM
dual
) SELECT
tab.id,
sys_connect_by_path ( tab.name, '\' )
FROM
tab
WHERE
LEVEL = 3 CONNECT BY PRIOR tab.id = tab.parid
还有其他更优雅的写法吗?有的 start with xxx connect by prior t.parent=t.id
select parent,id,level from tableName
start with id='370883101000' connect by prior parent=id
start with子句: 递归的条件,需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点,如果是父节点那么求出的就是他的子节点和子孙节点,如果不懂可以把上面start with 后面的条件改成 p.parent=0,就可以理解了。
connect by子句:连接条件。 关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历, 反之,如果 prior跟子节点放在一起(prior p.id)表示往叶子方向遍历。 这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。