簡體   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