34

我有一个具有以下结构的表

表名:matches

表名:匹配

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

表名:groups

在此处输入图像描述

group_ID存储MIN Product_ID组成Product_IDS一个组的。举个例子让我们说

如果 A 匹配 B 并且 B 匹配 C 那么三行应该以格式进入组表(A, A), (A, B), (A, C)

我曾尝试研究共同相关的子查询和 CTE,但没有实现这一点。

我需要在 SQL 中完成这一切。

谢谢您的帮助 。

4

3 回答 3

64

试试这个:

;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)来控制递归深度。

SQL 小提琴演示

于 2013-01-25T08:48:57.940 回答
2

像这样的东西(未测试)

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;
于 2013-01-25T08:48:44.717 回答
2

递归级别的示例:

在此处输入图像描述

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
于 2019-03-19T18:18:16.637 回答