使用T-SQL在分层数据中查找特定的父级

4

我有一些具有层次结构的对象。每个对象都有一个ID,一个父对象(表格中的TO_ID)和一个类型。 我的数据在一个表格中,看起来像这样:

ID  | TO_ID | TYPE
123 | 103   | group
176 | 103   | field
256 | 169   | group
103 | 234   | organization
234 | 390   | site

现在我想要搜索表格,直到找到具有特定类型的父对象(我不知道我的起始对象有多少个父对象)。
例如,我以 ID 123 开始,想要找到具有 TYPEsite 的父对象的 ID
如何使用 SQL 解决这个问题?
1个回答

5

您需要使用递归CTE来实现:

DECLARE @t TABLE (ID INT, TO_ID INT, TYPE VARCHAR(100));

INSERT INTO @t VALUES
(123, 103, 'group'),
(176, 103, 'field'),
(256, 169, 'group'),
(103, 234, 'organization'),
(234, 390, 'site'),
(390, 999, 'notme');

DECLARE @start INT = 123;
DECLARE @stop VARCHAR(100) = 'site';

WITH cte AS (
    SELECT base.*, 1 AS LVL
    FROM @t base
    WHERE ID = @start
    UNION ALL
    SELECT curr.*, LVL + 1
    FROM @t curr
    INNER JOIN cte prev ON curr.ID = prev.TO_ID
    WHERE prev.TYPE <> @stop
)
SELECT *
FROM cte
ORDER BY LVL

递归CTE实际上是一个迭代查询。你从一些行(123行)开始,然后不断将行添加到前一次迭代的结果中,直到满足某些条件(没有行可用或在前一次迭代中找到了site)。以下是结果:

ID  | TO_ID | TYPE         | LVL
123 | 103   | group        | 1
103 | 234   | organization | 2
234 | 390   | site         | 3

如果您不想查找两个节点之间的完整路径,则从curr中删除where子句,并在最后添加WHERE TYPE = site


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接