SQL Server:递归查询
我一直在努力编写逻辑,以显示相互关联的记录之间的关系 以下是一些示例数据,以显示我正在努力实现的目标:SQL Server:递归查询,sql,sql-server,tsql,recursion,hierarchy,Sql,Sql Server,Tsql,Recursion,Hierarchy,我一直在努力编写逻辑,以显示相互关联的记录之间的关系 以下是一些示例数据,以显示我正在努力实现的目标: CREATE TABLE #temp_data ( item_id int, item_name varchar(100), related_item_id int, related_item_name varchar(100) ) INSERT INTO #temp_data select 10, 'apple', 20 , 'orange' UNION ALL sel
CREATE TABLE #temp_data
(
item_id int,
item_name varchar(100),
related_item_id int,
related_item_name varchar(100)
)
INSERT INTO #temp_data
select 10, 'apple', 20 , 'orange' UNION ALL
select 20, 'orange', 30 , 'grape' UNION ALL
select 30, 'orange', NULL , NULL UNION ALL
select 100, 'tomato', 200 , 'onion' UNION ALL
select 200, 'onion', 300 , 'tomato' UNION ALL
select 400, 'cucumber',100 , 'tomato' UNION ALL
select 300, 'pepper', NULL , NULL UNION ALL
select 500, 'lettuce', 400 , 'cucumber' UNION ALL
select 1000, 'beef' , NULL, NULL UNION ALL
select 10000, 'cheese, NULL, NULL
预期成果:
group_id item_id item_name related_item_id related_item_name
1 10 apple 20 orange
1 20 orange 30 grape
1 30 orange NULL NULL
2 100 tomato 200 onion
2 200 onion 300 tomato
2 300 pepper NULL NULL
2 400 cucumber 100 tomato
2 500 lettuce 400 cucumber
3 1000 beef NULL NULL
4 10000 cheese NULL NULL
我试图通过递归CTE来实现这一点,但运气不好。这里有一个解决方案
;WITH T AS (
SELECT
ROW_NUMBER() OVER (ORDER BY item_id) AS group_id,
*
FROM #temp_data T
WHERE related_item_Id IS NULL
UNION ALL
SELECT T.group_id, T1.*
FROM T
INNER JOIN #temp_data T1
ON T.item_id = T1.related_item_id
)
SELECT * FROM T ORDER BY group_id, item_id
输出为
group_id item_id item_name related_item_id related_item_name
-------------------- ----------- --------------- --------------- -----------------
1 10 apple 20 orange
1 20 orange 30 grape
1 30 grape NULL NULL
2 100 tomato 200 onion
2 200 onion 300 tomato
2 300 pepper NULL NULL
2 400 cucumber 100 tomato
2 500 lettuce 400 cucumber
请编辑您的帖子以显示您尝试的CTE,以及结果的错误。上面发布的数据只是一些示例数据,用于说明示例。我试图找出如何编写逻辑来显示具有匹配item\u id/相关item\u id的记录之间的关系。例如,A=B和B=C,我在编写显示A=C的逻辑时遇到问题。是否存在一组项目,其中一个项目没有
相关的\u item\u id=NULL
?关系是否始终是一个简单的树,或者项目之间的关系是否存在循环?如果这两个都是真的,那么答案就不同了。示例数据的一个关键部分是确保它完全捕捉到与实际数据集相关的细微差别和复杂性。是的,你举的例子可能会发生。我已经更新了示例数据,以反映此情况。SQLFiddle与解决方案(为了可读性进行了一些扩展):