1

以下に示すように、Oracle dbにテーブルがあります。

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 があります。クエリに渡すフォルダー ID のすべての子フォルダー ID。1000 を渡すと、すべての子行とサブ子行が返されます。

ありがとう

4

3 に答える 3

3
select folderid, name
from the_unknown_table
start with folderid = 1000
connect by prior folderid = parentfolderId;
于 2012-05-17T10:50:40.247 に答える
2

次のようなCONNECT BYクエリを試してください。

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

コンマで区切られた1つの列にすべてが必要な場合は、使用します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;
于 2012-05-17T10:55:20.837 に答える
0

標準的な SQL の方法 (connect by/prior と同等) では、再帰的な 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)
于 2012-05-17T11:09:11.210 に答える