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

时间:2018-11-08 07:45:48

标签: sql sql-server tsql hierarchical-data

我有按层次结构排列的对象。每个对象都有一个ID,一个父对象(表中的TO_ID)和一个类型。 我的数据在一个像这样的表中:

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

现在,我要搜索表,直到找到具有特定类型的父对象(我不知道我的起始对象有多少个父对象)。

例如,我从ID 123开始,并想用ID TYPE找到父对象的site

如何使用SQL解决此问题?

1 个答案:

答案 0 :(得分:5)

为此,您需要递归CTE:

mySaleModelArray2

递归CTE实际上是一个迭代查询。您从一些行(第123行)开始,然后继续将行追加到上一个迭代的结果中,直到满足某些条件为止(您用完了行或在上一个迭代中找到了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 )。结果如下:

site

如果您不希望在两个节点之间找到完整的路径,请从curr中删除where子句,并在最后添加ID | TO_ID | TYPE | LVL 123 | 103 | group | 1 103 | 234 | organization | 2 234 | 390 | site | 3