我有一个具有一对多关系的表,用于跟踪哪些票证彼此相关。一个票证可以有任意数量的子项和父项。
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的新手,所以请耐心听我说,这就是我现在所知道的:
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,并将内部联接翻转为
ON C2.LNK_TIC_Child = C.LNK_TIC_Parent但是它没有影响任何东西,我真的不确定我应该把它放在哪里。我甚至不确定这是否在CTE所能做的范围之内。
发布于 2016-07-09 06:55:45
下面是我得到的信息:
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)…并称之为好的。
https://stackoverflow.com/questions/38274411
复制相似问题