gpt4 book ai didi

sql - Oracle DB Order Tree Siblings By Sibling Linked List

转载 作者:行者123 更新时间:2023-12-04 15:44:29 25 4
gpt4 key购买 nike

我打算将树对象存储在数据库表中。这是我的架构:

CREATE TABLE Nodes (
ID number(11) NOT NULL,
dataID number(11) NOT NULL,
parentNode number(11),
siblingNode number(11),
);

假设我有三棵树 A、B、C,其根节点的父节点为 NULL。我想从节点表中选择所有记录,按它们所属的树分组,像深度优先搜索一样排序, sibling 按各自的链表排序。例如,如果 D、E 和 F 是节点 A 的子节点,并且预期的顺序是 F->E->D,那么 F 的兄弟节点为 NULL,E 的 ID 将为兄弟节点,而 D 的 ID 为兄弟节点.

到目前为止,我已经完成了一个通常的 CONNECT BY 查询,我看到有一个 ORDER SIBLINGS BY 子句,但这只能通过对升序或降序值进行排序,而不是使用链表进行排序。到目前为止,我的查询只是对 ID 进行排序,并且没有考虑同级链接(并且可以保证同级项的输入顺序)。
SELECT ID, connect_by_root(ID) root
FROM Nodes
START WITH parentNode IS NULL
CONNECT BY PRIOR ID = parentNode
ORDER SIBLINGS BY ID ASC;

最终,我想使用 LISTAGG 从数据函数中创建一个字符串,以在我的树上创建一个 View 。该 View 每棵树(A、B、C)有一行,其中包含一个用波兰语表示法表示树的字符串。到目前为止,我有:
SELECT DISTINCT connect_by_root(ID) root, LISTAGG(dataString(ID), ' ') WITHIN GROUP (ORDER BY ID ASC) OVER (PARTITION BY connect_by_root(ID)) polish
FROM Nodes
START WITH parentNode IS NULL
CONNECT BY PRIOR ID = parentNode
ORDER SIBLINGS BY ID ASC;

我是 Oracle DB 的新手,不知道是否有更好的方法来执行上述任何操作。我欢迎任何评论,特别想知道如何通过链接对 sibling 进行排序。

样本数据:

编号:1;数据ID =>'-';父节点:空;兄弟节点:空;
编号:2;数据ID =>'1';父节点:1;兄弟节点:3;
编号:3;数据ID =>'6';父节点:1;兄弟节点:空;
编号:4;数据ID =>'*';父节点:空;兄弟节点:空;
编号:5;数据ID =>'8';父节点:4;兄弟节点:空;
编号:6;数据ID =>'8';父节点:4;兄弟节点:5;

期望输出:

编号:1;波兰语:'+ 6 1'
编号:4;波兰语:'* 8 8'

ORDER SIBLINGS BY ID ASC 的问题是第一个输出将返回与“- 6 1”不同的“- 1 6”。

我已经用演示问题的示例数据创建了一个 fiddle 。此外,出于某种原因,它不会让我使用 ORDER SIBLINGS BY 子句......
http://sqlfiddle.com/#!4/6ec46/4

最佳答案

如果我正确理解您的问题,您需要 Hierarchical Query返回波兰表示法(叶节点)及其对应的节点 -> 根节点路径。然后,您将使用此查询提供波兰符号关系的 View 。

而不是 LISTAGG功能,你能用SYS_CONNECT_BY_PATH吗?并使用空格或任何其他有效的 VARCHAR 作为分隔符?查询将类似于以下内容:

SELECT DISTINCT ID AS root, SYS_CONNECT_BY_PATH(dataString(ID), ' ') POLISH
FROM Nodes
START WITH parentNode IS NULL
CONNECT BY PRIOR ID = parentNode
ORDER SIBLINGS BY ID ASC;

如果我误解了您的问题,请告诉我,我会更新我的答案。

关于sql - Oracle DB Order Tree Siblings By Sibling Linked List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com