在同一列上选择具有多个条件的查询

时间:2017-07-04 12:08:37

标签: sql sql-server tsql select where-clause

我有两个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型完全相同,但当我尝试查询时,它会提供所有物品。因为像地板这样的物品很常见。

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)