【问题标题】:PLSQL Loop on parentidparentid 上的 PLSQL 循环
【发布时间】:2013-09-04 10:57:49
【问题描述】:

我正在使用一个函数并希望收到这样的字符串: 如您所见,它可能是“n 次”嵌套的。

<project id="123">
    <project id="12345" parentid="123"></project>
    <project id="12333" parentid="123>
        <project id="123345" parentid="12333"></project>
    </project>
</project>
<project id="1234">
     ...
</project>

PLSQL 到目前为止:

FOR i IN (   
        SELECT prj.ID AS PROJECT_ID, prj.PARENT_ID as PARENT_ID
        FROM PRJ_PROJECT prj 
        WHERE PARENT_ID IS NULL 
        )
LOOP
    sendXML := sendXML || '<project id="' ||  i.PROJECT_ID || '"' || ' parentid="' || i.PARENT_ID || '">' || '</project>';
END LOOP;

这将返回第一个“级别”。但在这个循环中,我想为数据库中的每个条目创建另一个循环,这样我就可以接收上面的 xml 字符串。

数据库长这样:

| ID     | PARENT_ID 
----------------------
| 123    | NULL 
| 12345  | 123 
| 12333  | 123
| 123345 | 12333 
| 1234   | NULL 

我怎样才能遍历它直到表中没有更多数据并继续下一个级别?

感谢您的帮助 马特

【问题讨论】:

    标签: oracle plsql hierarchy recursive-query


    【解决方案1】:

    使用connect by 使用分层查询

    SELECT prj.ID AS PROJECT_ID, 
           prj.PARENT_ID as PARENT_ID
    FROM PRJ_PROJECT prj 
    connect by prior prj.id = prj.parent_id
    start with prj.PARENT_ID IS NULL;
    

    为确保先出现根节点,然后是子节点,您可以像这样扩展语句:

    SELECT prj.ID AS PROJECT_ID, 
           prj.PARENT_ID as PARENT_ID,
           connect_by_root id as root_project_id
    FROM PRJ_PROJECT prj 
    connect by prior prj.id = prj.parent_id
    start with prj.PARENT_ID IS NULL
    order by connect_by_root id, level;
    

    这是一个 SQLFiddle:http://sqlfiddle.com/#!4/606a7/1

    【讨论】:

    • 这看起来很有趣。这会以“正确”的顺序返回数据吗?你有提示如何创建返回字符串吗?
    猜你喜欢
    • 2023-03-25
    • 2019-11-08
    • 2014-05-25
    • 2022-08-03
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多