我有按层次结构排列的对象。每个对象都有一个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解决此问题?
答案 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
。