如何筛选出包含3个及以上配料编号的产品全量记录?
如何筛选出包含3个及以上配料编号的产品全量记录?
你好!我来帮你解决这个问题~首先先说说你之前遇到的问题:你写的EXISTS语句有语法错误,而且逻辑上没关联外部表,导致子查询只要能找到符合条件的产品,就会让所有记录都被返回,这就是为什么你得到了全量数据。
我给你两种实用的解决方法,你可以根据自己的数据库环境选择:
方法一:先筛选合格产品再关联原表
这种方法先通过分组统计找出有3个及以上配料的产品,再和原表关联获取这些产品的所有配料记录:
SELECT i.product, i.ingredno FROM Ingreds i INNER JOIN ( -- 先找出符合条件的产品:配料数>=3 SELECT product FROM Ingreds GROUP BY product HAVING COUNT(*) >= 3 -- 注意:如果你要的是「超过3个」(也就是4个及以上),就把>=改成> ) AS qualified_products ON i.product = qualified_products.product
这里要提醒你,你之前写的COUNT(0)和COUNT(*)效果是一样的,但COUNT(*)是更通用的写法哦。
方法二:用窗口函数快速实现
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种方法更简洁直观,直接给每一行标记它所属产品的配料总数,再筛选总数符合条件的行:
SELECT product, ingredno FROM ( SELECT product, ingredno, -- 计算每个产品的配料总数,给每一行都带上这个数值 COUNT(*) OVER (PARTITION BY product) AS ingred_count FROM Ingreds ) AS product_ingreds WHERE ingred_count >= 3
为什么你之前的ROW_NUMBER没生效?
你提到用ROW_NUMBER()没成功,是因为ROW_NUMBER()是给每个产品的配料编号排顺序(比如产品C的配料会被标成1、2、3),如果用它筛选的话,只能得到每个产品第3个及以后的配料,而不是所有配料。要统计总数的话,得用COUNT(*) OVER (PARTITION BY product)这种窗口统计函数才行。
备注:内容来源于stack exchange,提问作者angelo
相关产品推荐
相关产品推荐

