【问题标题】:Finding downstream member of tree within SQL Hierarchy Query?在 SQL 层次结构查询中查找树的下游成员?
【发布时间】:2022-11-16 18:15:35
【问题描述】:

我有一个二叉树,其中设备连接到节点(通过邻接表连接)。我正在尝试将设备的价值与其下游的设备进行比较。我在获取下游设备时遇到问题。

假设我有一张桌子:

DEVICE NODE PARENT_NODE LEVEL
1 a null 1
null b a 2
null c b 3
2 d c 4
3 e d 5
9 m b 3
null n m 4
7 o n 5

我将如何将最近的下游设备加入每个设备行?我期待着:

DEVICE DOWNSTREAM_DEVICE
1 null
2 1
3 2
9 1
7 9

一些假设:设备或节点没有顺序(假设它们都是唯一的 ID)。 LEVEL 是层级。我正在使用 Oracle SQL。

我以为我可以只使用滞后函数来执行此查询,但显然由于树分支,这将行不通。我的错误结果如下:

DEVICE DOWNSTREAM_DEVICE
1 null
2 1
3 2
9 3 <- wrong
7 9

任何线索将不胜感激。

【问题讨论】:

    标签: sql oracle hierarchy adjacency-list


    【解决方案1】:

    使用分层查询:

    SELECT CONNECT_BY_ROOT device AS device,
           CASE WHEN LEVEL = 1 THEN NULL ELSE device END AS downstream_device
    FROM   table_name
    WHERE  CONNECT_BY_ISLEAF = 1
    START WITH device IS NOT NULL
    CONNECT BY PRIOR parent_node = node
    AND        (LEVEL = 2 OR PRIOR device IS NULL)
    

    其中,对于样本数据:

    CREATE TABLE table_name (DEVICE, NODE, PARENT_NODE, LVL) AS
    SELECT 1,    'a', null, 1 FROM DUAL UNION ALL
    SELECT null, 'b', 'a',  2 FROM DUAL UNION ALL
    SELECT null, 'c', 'b',  3 FROM DUAL UNION ALL
    SELECT 2,    'd', 'c',  4 FROM DUAL UNION ALL
    SELECT 3,    'e', 'd',  5 FROM DUAL UNION ALL
    SELECT 9,    'm', 'b',  3 FROM DUAL UNION ALL
    SELECT null, 'n', 'm',  4 FROM DUAL UNION ALL
    SELECT 7,    'o', 'n',  5 FROM DUAL;
    

    输出:

    DEVICE DOWNSTREAM_DEVICE
    1 null
    2 1
    3 2
    9 1
    7 9

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多