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