【问题标题】:query from the child to the great great grandfather list in ORACLE 12cORACLE 12c中从孩子到曾祖父列表的查询
【发布时间】:2015-08-17 12:12:51
【问题描述】:

我需要有关 SQL 查询的帮助。 我有这张桌子:

ITEM     PARENT
1          NULL
2           1
3           2
4           2
5           3
6           5
7           5
8           4
9           8
10          1
11          10
12          10
13          8       

选择一个项目,我需要以下结果:

选择项 9:家庭列表:8,4,2,1

【问题讨论】:

    标签: sql oracle parent-child hierarchy oracle12c


    【解决方案1】:

    您可以使用START WITHCONNECT BY 解决此问题

    Oracle documentation for Hierarchical Queries

    您的情况下的 SQL 如下所示

    SELECT item 
      FROM t START WITH item = 9 
    CONNECT BY PRIOR parent = item
    

    【讨论】:

    • 感谢 mcha,但我已经阅读了这个文档,但我无法解决问题
    • @Madmartigan 我添加了 SQL,我没有 Oracle 来测试,这就是我一开始没有写查询的原因:)
    • select PARENT, ITEM from table where PARENT is not null START WITH item = 9 connect by prior PARENT = ITEM order by PARENT, ITEM
    • 难以置信。这是我使用的查询。我刚刚将“ITEM = PARENT”更改为“PARENT = ITEM”,它可以工作
    • 不客气!基本上你会使用 CONNECT BY PRIOR 来检索子项目,在你的情况下你正在做相反的事情,检索孩子的父母,这就是为什么你需要连接 parent = item 而不是 item = parent
    【解决方案2】:

    具体9

    SELECT parent
    FROM yourtable 
    WHERE item = 9
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                    FROM yourtable y2
                    WHERE item = 9
                    AND item = y2.item)
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                   FROM yourtable 
                   WHERE item IN (SELECT parent
                                  FROM yourtable y2
                                  WHERE item = 9
                                  AND item = y2.item))
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                   FROM yourtable 
                   WHERE item IN (SELECT parent
                                  FROM yourtable 
                                  WHERE item IN (SELECT parent
                                                 FROM yourtable y2
                                                 WHERE item = 9
                                                 AND item = y2.item)))
    

    使用参数@ITEM

    SELECT parent
    FROM yourtable 
    WHERE item = @ITEM
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                    FROM yourtable y2
                    WHERE item = @ITEM
                    AND item = y2.item)
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                   FROM yourtable 
                   WHERE item IN (SELECT parent
                                  FROM yourtable y2
                                  WHERE item = @ITEM
                                  AND item = y2.item))
    UNION ALL
    SELECT parent
    FROM yourtable 
    WHERE item IN (SELECT parent
                   FROM yourtable 
                   WHERE item IN (SELECT parent
                                  FROM yourtable 
                                  WHERE item IN (SELECT parent
                                                 FROM yourtable y2
                                                 WHERE item = @ITEM
                                                 AND item = y2.item)))
    

    输出

    PARENT
    8
    4
    2
    1
    

    SQL 小提琴:http://sqlfiddle.com/#!4/97af9/11/0

    【讨论】:

    • 谢谢马特,问题是我的真实表比示例表长
    • 多长时间?您可以将第一条语句存储为变量,然后将其加载 x 次 (count(item)) 或其他内容,或者循环它直到 parent 为 nulll
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多