You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中SELECT DISTINCT使用报错及重复数据问题咨询

问题解决:SELECT DISTINCT与ORDER BY的冲突报错

报错原因

PostgreSQL 规定:使用 SELECT DISTINCT 时,ORDER BY 子句中的所有字段必须出现在 SELECT 的查询列中。这是因为去重后,同一film.name可能对应多条不同year的记录,数据库无法确定用哪条记录的year来排序。

解决方案

方案1:将ORDER BY字段加入SELECT列表

把year添加到查询列中,同时保留DISTINCT,这样数据库能明确每个去重后记录的排序依据:

SELECT DISTINCT film.name, year 
FROM film
INNER JOIN participation ON film.cod_film = participation.cod_film
WHERE year < 2000 AND professional.name = 'Kenneth Branagh'
ORDER BY year ASC;

方案2:使用PostgreSQL特有的DISTINCT ON语法

如果不想在结果中显示year,可以用DISTINCT ON指定按film.name去重,同时通过ORDER BY先按去重字段排序,再按year排序,确保每个电影名保留最早年份的记录:

SELECT DISTINCT ON (film.name) film.name
FROM film
INNER JOIN participation ON film.cod_film = participation.cod_film
WHERE year < 2000 AND professional.name = 'Kenneth Branagh'
ORDER BY film.name, year ASC;

方案3:用GROUP BY替代DISTINCT实现去重

通过GROUP BY film.name合并重复的电影记录,再用聚合函数MIN(year)获取每个电影的最早年份作为排序依据:

SELECT film.name
FROM film
INNER JOIN participation ON film.cod_film = participation.cod_film
WHERE year < 2000 AND professional.name = 'Kenneth Branagh'
GROUP BY film.name
ORDER BY MIN(year) ASC;

内容的提问来源于stack exchange,提问作者bakun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:19