考虑下面的产品表
假设用户需要键入组件的组合以获取产品。如果用户输入 ice 和茶,系统将仅显示冰茶而不是冰茶(或其他可能的产品,以冰为组分)。如果用户仅输入冰作为组件,则它将仅显示冰作为产品。如果用户只输入巧克力,则不需要返回任何结果,因为组件的组合不会累积产品,也不存在巧克力作为其唯一组件的其他产品
产品和组件的组合是独一无二的。不存在具有相同组件的其他产品。意思是冰,茶和牛奶只会产生冰奶茶。
我在查询(MSSQL)以获得我想要的结果时有点困惑。我可以看到组合和流程,但不知道要使用的确切查询。
有人可以建议/指出正确的方向吗?
感谢您的关注。 :) :) :) xoxoxox
补充: 表模式
从产品中选择*
答案 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)
@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)