考虑下表的产品

假设用户需要输入组件的组合才能获得产品。如果用户输入、冰、和茶,系统将只显示冰茶,而不显示冰奶茶(或其他可能以冰为成分的产品)。如果用户只输入冰作为组件,它将只显示冰作为产品。如果用户只输入巧克力,则不需要返回结果,因为组件的组合并不是产品的组合,也不存在以巧克力为唯一组件的其他产品。
组件的产品和组合是独特的。不存在具有相同组件的其他产品。意味着冰、茶和牛奶只会产生冰红茶。
为了得到我想要的结果,我有点被困在来查询(MSSQL)中。我可以看到组合和流程,但不知道确切的查询使用。
有人能建议/指出正确的方向吗?
谢谢你们的关注。()
添加:表模式

从产品中选择*

发布于 2015-03-31 04:27:44
这是一个无余数关系除法(RDNR)问题。看看这个由Dwain阵营提供的article,它为这类问题提供了许多解决方案。
您还需要一个字符串拆分器来拆分逗号分隔的组件变量。以下是Jeff的DelimitedSplit8K函数。
DECLARE @components VARCHAR(100) = 'ice,tea';
DECLARE @component TABLE(Component VARCHAR(100));
INSERT INTO @component
SELECT Item
FROM dbo.DelimitedSplit8K(@components, ',')
SELECT
t.Product
FROM(
SELECT Product, CNT = COUNT(*)
FROM Product
GROUP BY Product
)t
INNER JOIN(
SELECT CNT = COUNT(*) FROM @Component
)s
ON s.CNT = t.CNT
INNER JOIN Product p
ON p.Product = t.Product
INNER JOIN @component c
ON c.Component = p.Component
GROUP BY t.Product
HAVING COUNT(*) = MIN(s.CNT)SQL Fiddle
@,这里有一个简单得多的方法:
SELECT
p.Product
FROM Product p
WHERE p.Component IN('Ice','Tea')
GROUP BY p.Product
HAVING
COUNT(Component) = 2
AND COUNT(Component) = (SELECT COUNT(*) FROM Product WHERE Product = p.Product)SQL Fiddle
https://stackoverflow.com/questions/29360332
复制相似问题