sqlserver中的递归查询

sqlserver中的递归查询,sql,sql-server,Sql,Sql Server,我有一张有以下结构的桌子 表名称:匹配项 它基本上存储了与哪个产品匹配的产品。我需要处理这张桌子 并存储在如下所示的组表中 表名:组 group\u ID存储组成一个组的Product\u ID的MIN Product\u ID。举个例子,让我们说 如果A与B匹配,B与C匹配,则三行应以(A,A)、(A,B)、(A,C) 我曾尝试研究相关子查询和CTE,但没有实现 我需要在SQL中完成这一切 谢谢你的帮助。类似的东西(未测试) 试试这个: ;WITH CTE AS ( SELECT

我有一张有以下结构的桌子

表名称:
匹配项

它基本上存储了与哪个产品匹配的产品。我需要处理这张桌子 并存储在如下所示的组表中

表名:

group\u ID
存储组成一个组的
Product\u ID
MIN Product\u ID
。举个例子,让我们说

如果A与B匹配,B与C匹配,则三行应以
(A,A)、(A,B)、(A,C)

我曾尝试研究相关子查询和CTE,但没有实现

我需要在SQL中完成这一切

谢谢你的帮助。

类似的东西(未测试)

试试这个:

;WITH CTE
AS
(
    SELECT DISTINCT
        M1.Product_ID Group_ID,
        M1.Product_ID
    FROM matches M1
        LEFT JOIN matches M2
            ON M1.Product_Id = M2.matching_Product_Id
    WHERE M2.matching_Product_Id IS NULL
    UNION ALL
    SELECT
        C.Group_ID,
        M.matching_Product_Id
    FROM CTE C
        JOIN matches M
            ON C.Product_ID = M.Product_ID
)
SELECT * FROM CTE ORDER BY Group_ID
您可以使用
选项(MAXRECURSION n)
来控制递归深度


递归级别的示例:


您可以使用.Recursive CTE,这似乎是在SQL中实现递归处理的唯一方法,但我的问题并没有完全解决。你能给我举个接近我要求的例子吗。谢谢你的帮助。不是真的,我只是浏览所有产品,执行匹配算法,然后将匹配结果保存在“matches”表中。我认为没有什么比根节点更好的了。当我尝试使用实际数据时,这不会返回任何结果@Ankit我想你应该避免像(1,2)和(2,1)这样的一对。谢谢我按照你说的做了,看这里,用这个数据进行查询很好。但将(22945431802989)添加到最后一个会破坏它,并开始给出最大递归级别达到的错误。知道为什么吗?什么样的数据会导致这种情况?好的,如果你加上(22945431802989),你会得到这对(18029892294543)的无限递归。请看我上面的评论。好的,我知道哪里出了问题。如果数据像A一样匹配B和C,C匹配D,那么它工作并组成组(A,B,C,D),但是如果数据像A一样匹配B和C,D匹配C,那么它组成两个组(ABC)(DC)。似乎它只能用一种方式工作,而不是两种方式。-它不会返回正确的结果。如果它的每个实例都被注释掉,为什么要声明@VALUE\u代码?此外,这个答案似乎非常特定于您的表格式,而不是问题中引用的模式
;WITH CTE
AS
(
    SELECT DISTINCT
        M1.Product_ID Group_ID,
        M1.Product_ID
    FROM matches M1
        LEFT JOIN matches M2
            ON M1.Product_Id = M2.matching_Product_Id
    WHERE M2.matching_Product_Id IS NULL
    UNION ALL
    SELECT
        C.Group_ID,
        M.matching_Product_Id
    FROM CTE C
        JOIN matches M
            ON C.Product_ID = M.Product_ID
)
SELECT * FROM CTE ORDER BY Group_ID
DECLARE @VALUE_CODE AS VARCHAR(5);

--SET @VALUE_CODE = 'A' -- Specify a level

WITH ViewValue AS
(
    SELECT ValueCode
    , ValueDesc
    , PrecedingValueCode
    FROM ValuesTable
    WHERE PrecedingValueCode IS NULL
    UNION ALL
    SELECT A.ValueCode
    , A.ValueDesc
    , A.PrecedingValueCode 
    FROM ValuesTable A
    INNER JOIN ViewValue V ON
        V.ValueCode = A.PrecedingValueCode
)

SELECT ValueCode, ValueDesc, PrecedingValueCode

FROM ViewValue

--WHERE PrecedingValueCode  = @VALUE_CODE -- Specific level

--WHERE PrecedingValueCode  IS NULL -- Root