У меня есть две таблицы: одна — сопоставление клиентов продукта, а другая — таблица обмена продуктами. Используя рекурсивный CTE SQL, я пытаюсь найти все продукты, которые связаны как цепочка, сопоставленные с клиентами. Кроме того, если продукт используется совместно с другим продуктом, мне также необходимо включить его в цепочку. Надеюсь, мой пример имеет больше смысла, чем описание
Product Customer Table
Product Customer
Milk Illinois
Milk Michigan
Butter Michigan
Cream Wisconsin
Honey Wisconsin
Cheese Minnesota
Product Sharing Table
Product SharedProduct
Butter Cream
Cream Cheese
Для приведенных выше данных допустим, что мой входной продукт — молоко, тогда набор результатов должен включать все продукты — молоко, масло, сливки, мед и сыр. Здесь Butter-Cream и Cream-Cheese связаны через таблицу обмена продуктами.
Мой текущий SQL выглядит так, но на самом деле он не работает более чем на один уровень.
WITH Product_CTE AS
(
SELECT DISTINCT [Product] FROM ProductCustomer
WHERE [Product] IN (SELECT DISTINCT p2.[Product]
FROM ProductCustomer p1 INNER JOIN ProductCustomer p2
ON p1.[Customer] = p2.[Customer] WHERE p1.[Product] = 'Milk')
UNION ALL
SELECT [SharedProduct] FROM ProductSharing b
INNER JOIN Product_CTE p ON p.[Product] = b.[Product]
)
Select [Product] from Product_CTE
Honey
из: Молоко › Мичиган › Масло › Сливки (через обмен) › Висконсин › Мед. Это правильно? - person HABO   schedule 23.08.2012