从组合中获取产品

时间:2015-03-31 03:54:42

标签: sql sql-server tsql

考虑下面的产品表

enter image description here

假设用户需要键入组件的组合以获取产品。如果用户输入 ice ,系统将仅显示冰茶而不是冰茶(或其他可能的产品,以冰为组分)。如果用户仅输入冰作为组件,则它将仅显示冰作为产品。如果用户只输入巧克力,则不需要返回任何结果,因为组件的组合不会累积产品,也不存在巧克力作为其唯一组件的其他产品

产品和组件的组合是独一无二的。不存在具有相同组件的其他产品。意思是冰,茶和牛奶只会产生冰奶茶。

我在查询(MSSQL)以获得我想要的结果时有点困惑。我可以看到组合和流程,但不知道要使用的确切查询。

有人可以建议/指出正确的方向吗?

感谢您的关注。 :) :) :) xoxoxox

补充: 表模式 enter image description here

从产品中选择* enter image description here

1 个答案:

答案 0 :(得分:3)

这是关系部门,没有剩余(RDNR)问题。请参阅Dwain Camps的article,为这类问题提供了许多解决方案。

您还需要一个字符串拆分器来拆分逗号分隔的组件变量。以下是Jeff Moden的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


@Tim Biegeleisen,这是一个更简单的方法:

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