首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从树中的任何位置查找层次结构中的所有行

从树中的任何位置查找层次结构中的所有行
EN

Stack Overflow用户
提问于 2016-07-09 03:52:08
回答 1查看 104关注 0票数 0

我有一个具有一对多关系的表,用于跟踪哪些票证彼此相关。一个票证可以有任意数量的子项和父项。

代码语言:javascript
复制
LNK_TIC_Parent    LNK_TIC_Child
--------------    ----------  
       1              2  
       1              3          
       4              3              
       4              5                        
       5              6


       1          4
   ___/ \___   __/ \__
  /         \ /       \
 2           3         5
                        \
                         6

我正在尝试选择一个整个祖先的票证,而不管您从树中的哪个位置开始。因此,在本例中,如果从票证6、票证3或票证1开始,将返回全部5行。顺序对我来说并不重要。

我是CTE的新手,所以请耐心听我说,这就是我现在所知道的:

代码语言:javascript
复制
WITH linktree AS (
    SELECT
       LNK_TIC_Parent,LNK_TIC_Child
    FROM TicketLinks
  WHERE LNK_TIC_Parent = 1 OR LNK_TIC_Child = 1

UNION ALL

SELECT C.LNK_TIC_Parent,C.LNK_TIC_Child
    FROM TicketLinks C
INNER JOIN linktree C2 ON C.LNK_TIC_Parent = C2.LNK_TIC_Child
)

SELECT * FROM linktree

这将仅返回票证1的直系后代。我尝试添加另一个CTE,并将内部联接翻转为

代码语言:javascript
复制
ON C2.LNK_TIC_Child = C.LNK_TIC_Parent

但是它没有影响任何东西,我真的不确定我应该把它放在哪里。我甚至不确定这是否在CTE所能做的范围之内。

EN

回答 1

Stack Overflow用户

发布于 2016-07-09 06:55:45

下面是我得到的信息:

代码语言:javascript
复制
DECLARE @start INT = 3;
WITH [data] AS (
    SELECT * FROM (VALUES
       (1, 2),  
       (1, 3),          
       (4, 3),              
       (4, 5),                        
       (5, 6)
    ) AS x(parent, id)
), [going_up] AS (
    SELECT [data].[parent], [data].[id]
    FROM [data]
    WHERE [data].[id] = @start

    UNION ALL

    SELECT child.[parent], child.[id]
    FROM [going_up] AS [parent]
    JOIN [data] AS [child]
        ON child.[parent] = [parent].[id]
), [going_down] AS (
    SELECT [going_up].[parent] AS [id],
           NULL AS [parent]
    FROM [going_up]

    UNION ALL

    SELECT child.id, child.parent
    FROM data AS child
    JOIN [going_down] AS [parent]
        ON child.[parent] = [parent].[id]
)
SELECT * 
FROM [going_down]

本质上,我将其分解为两个不同的递归查询;一个在给定起始位置的情况下一直递归到树上,然后,一旦确定了这些节点,就一直向下递归。您会注意到输出中有重复的ID。这是因为有多种方法可以到达某些节点(特别是示例数据中的3个节点)。输出显示了每条路径。如果这对你来说并不重要,那就做select distinct(ID)…并称之为好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38274411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档