Postgres:选择字段计数大于1的所有行

新手上路,请多包涵

我有存储产品价格信息的表,该表看起来类似于,(不是主键)

 no   name    price    date
1    paper   1.99     3-23
2    paper   2.99     5-25
3    paper   1.99     5-29
4    orange  4.56     4-23
5    apple   3.43     3-11

现在我想选择“名称”字段在表中多次出现的所有行。基本上,我希望我的查询返回前三行。

我试过了:

 SELECT * FROM product_price_info GROUP BY name HAVING COUNT(*) > 1

但我收到一条错误消息:

列“product_price_info.no”必须出现在 GROUP BY 子句中或用于聚合函数

原文由 user2628641 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 873
2 个回答
SELECT *
FROM product_price_info
WHERE name IN (SELECT name
               FROM product_price_info
               GROUP BY name HAVING COUNT(*) > 1)

原文由 Juan Carlos Oropeza 发布,翻译遵循 CC BY-SA 3.0 许可协议

自联接版本,使用返回多次出现的名称的子查询。

 select t1.*
from tablename t1
join (select name from tablename group by name having count(*) > 1) t2
  on t1.name = t2.name

IN / EXISTS 版本基本相同,但可能更快一些。

原文由 jarlh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进