Рекурсивный запрос в 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.
Спасибо за помощь.
Ответы
Ответ 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;