首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用递归查询的存储过程

使用递归查询的存储过程
EN

Stack Overflow用户
提问于 2018-05-30 20:21:12
回答 1查看 10.7K关注 0票数 4

我正在编写一个存储过程,它应该返回结果,并且相同的结果将作为输入传递给存储过程,并且递归应该在输入和输出在任何特定时间相同后停止。

下面是存储过程/函数和运行命令(存储过程的新特性)。

代码语言:javascript
复制
CREATE FUNCTION dbo.Ancestors (@List VARCHAR(MAX))
RETURNS TABLE
AS
RETURN
WITH CTE AS
(
 SELECT DISTINCT Child AS RESULT FROM example WHERE Parent IN( SELECT Id = 
 Item FROM dbo.SplitInts(@List, ',')) or child IN (SELECT Id = Item FROM 
 dbo.SplitInts(@List, ','))
 UNION ALL
 SELECT DISTINCT Parent AS RESULT FROM example WHERE Parent IN( SELECT Id = 
 Item FROM dbo.SplitInts(@List, ',')) or child IN (SELECT Id = Item FROM 
 dbo.SplitInts(@List, ','))
 )
SELECT RESULT FROM CTE
UNION
SELECT RESULT FROM CTE
GO

CREATE PROCEDURE GetAncestors (@thingID VARCHAR(MAX))
AS
SELECT RESULT FROM dbo.Ancestors(@thingID)
GO

EXEC GetAncestors @thingID = '100'    

结果为- '100,101‘

代码语言:javascript
复制
EXEC GetAncestors @thingID = '100,101'

结果是- '100,101,102‘

代码语言:javascript
复制
EXEC GetAncestors @thingID = '100,101,102'

结果是- '100,101,102‘

我真正想要的是一次通过100、101或102的结果。

结果应为- '100,101,102‘

以下是示例表:

代码语言:javascript
复制
|     Parent          |     Child        |
|---------------------|------------------|
|      100            |      101         |
|---------------------|------------------|
|      101            |      102         |
|---------------------|------------------|
EN

回答 1

Stack Overflow用户

发布于 2018-05-30 22:54:55

看起来您需要一个简单的递归查询,该查询从给定节点开始向下遍历树。CTE将返回(Parent, Child)对的列表,因此我将它们合并在一起以获得单个节点的列表(并在此过程中删除重复的节点)。

请注意,该查询是递归的。CTE (公用表表达式)引用自身。

示例数据

我添加了更多的行来实际查看发生了什么。

代码语言:javascript
复制
DECLARE @T TABLE (Parent int, Child int);

INSERT INTO @T VALUES
(100, 101),
(101, 102),
(102, 103),
(103, 104),
(101, 108),
(108, 109),
(208, 209),
(209, 210);

查询

代码语言:javascript
复制
WITH
CTE
AS
(
    SELECT
        Parent, Child
    FROM @T
    WHERE Parent = 100

    UNION ALL

    SELECT
        T.Parent, T.Child
    FROM
        CTE
        INNER JOIN @T AS T ON T.Parent = CTE.Child
)
SELECT
    Parent AS Result
FROM CTE

UNION

SELECT
    Child AS Result
FROM CTE
;

结果

代码语言:javascript
复制
Result
100
101
102
103
104
108
109

您可以将查询放在存储过程中,如下所示:

代码语言:javascript
复制
CREATE PROCEDURE GetAncestors(@thingID int)
AS
BEGIN
    SET NOCOUNT ON;

    WITH
    CTE
    AS
    (
        SELECT
            Example.Parent, Example.Child
        FROM Example
        WHERE Parent = @thingID

        UNION ALL

        SELECT
            Example.Parent, Example.Child
        FROM
            CTE
            INNER JOIN Example ON Example.Parent = CTE.Child
    )
    SELECT
        Parent AS Result
    FROM CTE

    UNION

    SELECT
        Child AS Result
    FROM CTE
    ;

END
GO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50604574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档