如何查询Product表中productId唯一的所有数据行?
问题:如何从Product表中检索productId唯一的完整数据行?
需求:过滤掉重复productId的行,返回包含productId、name、price等所有字段的唯一productId数据行,期望结果格式如下:
productID| name | price | ... 1 | ... | ... | ... 2 | ... | ... | ... 3 | ... | ... | ...
尝试过以下两种SQL,均无法实现需求:
SELECT DISTINCT `productId` FROM `Product` SELECT * FROM `Product` WHERE DISTINCT `productId`
可行解决方案
方案1:GROUP BY + 聚合函数(通用所有支持GROUP BY的数据库)
当同一productId对应的其他字段值一致时,此方法最直接。通过GROUP BY productId确保每个productId只返回一行,其他字段用聚合函数(如MAX()/MIN())提取对应值:
SELECT productId, MAX(name) AS name, MAX(price) AS price, -- 其他字段按同样方式处理,根据业务选择MAX/MIN FROM Product GROUP BY productId;
如果同一productId下的其他字段存在不同值,需根据业务逻辑选择保留哪一个(比如用MAX()取最大的,MIN()取最小的)。
方案2:窗口函数ROW_NUMBER()(适用于MySQL 8.0+、PostgreSQL、SQL Server等)
如果需要精准控制保留重复productId中的某一行(比如最新创建的、价格最高的),用窗口函数更灵活:
SELECT productId, name, price, ... FROM ( SELECT *, -- 按productId分组,每组内按创建时间倒序编号,最新的行编号为1 ROW_NUMBER() OVER (PARTITION BY productId ORDER BY create_time DESC) AS rn FROM Product ) t WHERE rn = 1;
修改ORDER BY后的字段可以指定保留的行(比如ORDER BY price DESC保留价格最高的行)。
为什么之前的SQL无效?
- 第一个SQL仅返回唯一的
productId字段,没有其他所需字段,不符合需求; - 第二个SQL语法错误,
WHERE子句不能直接使用DISTINCT关键字。
内容的提问来源于stack exchange,提问作者Dugong98
相关产品推荐
相关产品推荐

