Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:递归查询_Sql_Sql Server_Tsql_Recursion_Hierarchy - Fatal编程技术网

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与解决方案(为了可读性进行了一些扩展):