Подтвердить что ты не робот

Рекурсивный запрос в SQL Server

У меня есть таблица со следующей структурой

Название таблицы: matches

Table name: matches

Это в основном хранит, какой продукт соответствует тому продукту. Мне нужно обработать эту таблицу И сохраните таблицу групп, как показано ниже.

Название таблицы: groups

enter image description here

group_ID хранит MIN Product_ID Product_IDS, которые образуют группу. Чтобы привести пример, скажем

Если A соответствует B и B соответствует C, то три строки должны перейти к таблице групп в формате (A, A), (A, B), (A, C)

Я пробовал смотреть на связанные с ним подзапросы и CTE, но не добиваться этого.

Мне нужно сделать все это в SQL.

Спасибо за помощь.

4b9b3361

Ответ 1

Попробуйте следующее:

;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 FIDDLE DEMO

Ответ 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;