Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要SQL查询帮助才能从具有父子表的同一表中获取数据_Sql_Oracle - Fatal编程技术网

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

需要SQL查询帮助才能从具有父子表的同一表中获取数据,sql,oracle,Sql,Oracle,我的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

我的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包含childs 1200、1201、1202、1203。文件夹id 1200有子文件夹1204、1205。1201有孩子1206。1205有孩子1207、1208和1209。我要找的是获取传递给查询的文件夹id的所有子文件夹id。如果我超过1000,它将返回所有子行和子行

谢谢

尝试类似的查询

SELECT 
folderid, 
name
FROM the_unknown_table
START WITH  folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;
如果您想在一列中使用逗号分隔所有内容,请使用SYS\u CONNECT\u BY\u PATH

尝试查询式

SELECT 
folderid, 
name
FROM the_unknown_table
START WITH  folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;
如果您想在一列中使用逗号分隔所有内容,请使用SYS\u CONNECT\u BY\u PATH


与connect by/Previor等效的标准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)

与connect by/Previor等效的标准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)

独生子女和亚子女?或者所有可能的子子系统?我已经在我的表中看到了4级。所以,我至少需要达到4级。@Javeed-或者这种情况会改变吗,你将来有5级或以上的深度,那么你需要达到它的深度吗?Javeed,请接受一个对你来说正确的答案。独生子女和亚子女?或者所有可能的子子系统?我已经在我的表中看到了4级。所以,我至少需要达到4级。@Javeed-或者这种情况会改变吗,你将来会有5级或以上的深度,那么你需要达到它的深度吗?Javeed,请接受一个对你来说正确的答案。这需要Oracle 11.2。以前的版本只支持使用CONNECT BY的递归查询。问题被标记为sql和oracle,没有版本,我想添加一个通用解决方案。@wildpasser:我知道。我只是想指出,只有最新版本的Oracle支持这种语法。虽然不完全符合标准的要求,正如您所示,因为它不允许递归关键字,即使它在标准中是强制性的,至少到目前为止,Larry已经获得了足够的绳子来系船。这需要Oracle 11.2。以前的版本只支持使用CONNECT BY的递归查询。问题被标记为sql和oracle,没有版本,我想添加一个通用解决方案。@wildpasser:我知道。我只是想指出,只有最新版本的Oracle支持这种语法。虽然不完全符合标准的要求,正如您所展示的,因为它不允许递归关键字,即使它在标准中是强制性的,至少到目前为止,Larry已经获得了足够的绳子来系船。