我有一个具有以下结构的表
表名:matches

这基本上存储了哪个产品与哪个产品匹配。我需要处理这个表并存储在一个组表中,如下所示。
表名:groups

group_ID存储MIN Product_ID组成Product_IDS一个组的。举个例子让我们说
如果 A 匹配 B 并且 B 匹配 C 那么三行应该以格式进入组表(A, A), (A, B), (A, C)
我曾尝试研究共同相关的子查询和 CTE,但没有实现这一点。
我需要在 SQL 中完成这一切。
谢谢您的帮助 。
我有一个具有以下结构的表
表名:matches

这基本上存储了哪个产品与哪个产品匹配。我需要处理这个表并存储在一个组表中,如下所示。
表名:groups

group_ID存储MIN Product_ID组成Product_IDS一个组的。举个例子让我们说
如果 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
您可以使用它OPTION(MAXRECURSION n)来控制递归深度。
像这样的东西(未测试)
with match_groups as (
select product_id,
matching_product_id,
product_id as group_id
from matches
where product_id not in (select matching_product_id from matches)
union all
select m.product_id, m.matching_product_id, p.group_id
from matches m
join match_groups p on m.product_id = p.matching_product_id
)
select group_id, product_id
from match_groups
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