我有两个id
的主表ingredients master
------
id int
name varchar(50)
product master
-----
id int
pname varchar(50)
product ingredients
----
inId int (fk - ingredients master)
prId int (fk - product master)
现在的情况是产品的数据低于数据
成分大师 -----(id,name){[1,floor],[2,salt],[3,sugar],[4,oil],[5,pepper]}产品大师 -----(id,pname){[1,chapati],[2,披萨饼],[3,chappati 2型],[4,披萨饼2型}}
产品成分 -----(inId,prId){[1,1],[2,1],[3,1],[1,2],[2,2],[3,2],[4, 2],[1,3],[2,3],[3,3],[1,4],[2,4],[3,4],[4,4]}
现在我要点击一个精选查询,在那里我可以获得薄煎饼类型2作为替代薄饼或披萨面包类型2作为披萨面包的替代品
我已经尝试了谷歌,但是无法提出可行的解决方案。
我只想要那个给定项目的确切替代项目。像chapati和chapati type 2在成分方面完全相同。披萨面包和披萨面包2型完全相同,但当我尝试查询时,它会提供所有物品。因为像地板这样的物品很常见。
答案 0 :(得分:1)
当2种产品含有相同成分时,它被视为替代产品。每种产品都有多种成分 - 多排。比较跨越行的值很困难。如果每种产品只有1种成分 - 将多行组合成1个值,则可以更容易地识别出哪些产品具有相同的成分。
CREATE TABLE #IngredientsMaster
(IngredientId INT
,IngredientName VARCHAR(50)
);
CREATE TABLE #ProductMaster
(ProductId INT
, ProductName VARCHAR(50)
);
CREATE TABLE #ProductIngredients
(IngredientId INT
,ProductId INT
);
INSERT #IngredientsMaster
VALUES(1 , 'floor'), (2 , 'salt'), (3 , 'sugar'), (4 , 'oil'), (5 , 'pepper');
INSERT #ProductMaster
VALUES(1 , 'chapati'), (2 , 'pizza bun'), (3 , 'chappati type 2'), (4 , 'pizza bun type 2');
INSERT #ProductIngredients
VALUES (1, 1), (2, 1), (3, 1), (1, 2), (2, 2), (3, 2), (4, 2), (1, 3), (2, 3), (3, 3), (1, 4), (2, 4), (3, 4), (4, 4)
;WITH cte AS (SELECT pg.ProductId, Productname
, STUFF((SELECT '-' + cast(t.IngredientId AS VARCHAR(3))
FROM #ProductIngredients t
WHERE t.productId = pg.productId
ORDER BY t.ingredientId
FOR XML PATH('')
), 1, 1, '') AS Ingredients
FROM #ProductIngredients pg
INNER JOIN #IngredientsMaster i
ON i.IngredientId = pg.IngredientId
INNER JOIN #ProductMaster p
ON p.ProductId = pg.ProductId
GROUP BY pg.ProductId, Productname
)
SELECT *
FROM cte cte
WHERE EXISTS (SELECT * FROM cte t WHERE t.Ingredients = cte.Ingredients AND t.ProductId = 2);
答案 1 :(得分:0)
如果我理解您的问题,您可以使用此查询获取薄煎饼和披萨面包2型(共同)的成分:
select ingredients.id
from ingredients master join product master join product ingredients (complete it)
where product.name in ('chapati', 'pizza bun type 2')
group by ingredients.id
having count(*)>1
然后你可以找到含有相似成分的产品
select product.name
from ingredients master join product master join product ingredients (complete it)
where ingredients.id in (first query)