繁体   English   中英

需要SQL查询帮助才能从具有父子对象的同一表中获取数据

[英]SQL query help needed to get the data from same table with parent child

我的oracle数据库中有一个表,如下所示:

FolderID    Name    ParentFolderID
1200        A       1000
1201        B       1000
1202        C       1000
1203        D       1000
1204        E       1200
1205        F       1200
1206        G       1201
1207        H       1205
1208        I       1205
1209        J       1205

在此表中,文件夹ID 1000具有子项1200、1201、1202、1203。文件夹ID 1200具有子项1204、1205。1201具有子项1206。1205具有子项1207、1208和1209。我要查找的是get我要传递给查询的文件夹ID的所有子文件夹ID。 如果传递1000,则应返回所有子行和子子行。

谢谢

select folderid, name
from the_unknown_table
start with folderid = 1000
connect by prior folderid = parentfolderId;

尝试像CONNECT BY查询;

SELECT 
folderid, 
name
FROM the_unknown_table
START WITH  folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;

如果要在一列中用逗号分隔所有内容,请使用SYS_CONNECT_BY_PATH

SELECT 
folderid, 
SYS_CONNECT_BY_PATH(folderid,',') my_path,
name
FROM the_unknown_table
START WITH  folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;

标准的SQL方式(等效于按优先级连接)使用递归CTE:

DROP SCHEMA opa CASCADE;
CREATE SCHEMA opa;

SET search_path='opa';

CREATE TABLE parents
    ( id    INTEGER NOT NULL PRIMARY KEY 
    , zname text
    , parent_id INTEGER REFERENCES parents (id)
    );  
INSERT INTO parents(id,zname,parent_id) VALUES
(1000        , '@',       NULL)
,(1200        , 'A',       1000)
,(1201        , 'B',       1000)
,(1202        , 'C',       1000)
,(1203        , 'D',       1000)
,(1204        , 'E',       1200)
,(1205        , 'F',       1200)
,(1206        , 'G',       1201)
,(1207        , 'H',       1205)
,(1208        , 'I',       1205)
,(1209        , 'J',       1205)
    ;   

WITH RECURSIVE zopa AS (
    SELECT p0.id AS opa_id, p0.id AS id
      , p0.zname AS zname, p0.parent_id  AS parent_id
    FROM  parents p0
    WHERE NOT EXISTS (
        SELECT * FROM parents nx WHERE nx.id = p0.parent_id)
    UNION
    SELECT 
        zp.opa_id AS opa_id
        , p1.id AS id
        , p1.zname AS zname
        , p1.parent_id AS parent_id
    FROM parents p1
    JOIN zopa zp ON zp.id = p1.parent_id
    )   
select *
FROM zopa ct
WHERE ct.opa_id = 1000
    ;   

结果:

NOTICE:  drop cascades to table opa.parents
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "parents_pkey" for table "parents"
CREATE TABLE
INSERT 0 11
 opa_id |  id  | zname | parent_id 
--------+------+-------+-----------
   1000 | 1000 | @     |          
   1000 | 1202 | C     |      1000
   1000 | 1200 | A     |      1000
   1000 | 1201 | B     |      1000
   1000 | 1203 | D     |      1000
   1000 | 1205 | F     |      1200
   1000 | 1204 | E     |      1200
   1000 | 1206 | G     |      1201
   1000 | 1209 | J     |      1205
   1000 | 1207 | H     |      1205
   1000 | 1208 | I     |      1205
(11 rows)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM