Java基础、中级、高级、架构面试资料

解决 SELECT DISTINCT ON expressions must match initial ORDER BY expressions 的教程

SQL herman 3986浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

一般我们针对排重有两种快速的方法。一种是 DISTINCT,一种是 GROUP BY。但是 GROUP BY 分组之后,要配合聚合函数使用,比如:SUM、count、avg、max、min 等。

如果在 SELECT中 的列,没有在 GROUP BY 中出现,那么这个 SQL 是不合法的,因为列不在 GROUP BY 从句中,也就是说查出来的列必须在 group by 后面出现否则就会报错,或者这个字段出现在聚合函数里面。

给予这个限制,很多网友都喜欢使用 DISTINCT,而最近有同事在使用 DISTINCT 报了错,于是抛给我,在这里我总结一下,分享给大家!

SELECT DISTINCT ON expressions must match initial ORDER BY expressions

根据这个错误,我们查询官方文档得知:

DISTINCT ON ( expression [, …] ) keeps only the first row of each set of rows where the given expressions evaluate to equal. […]。 Note that the “first row” of each set is unpredictable unless ORDER BY is used to ensure that the desired row appears first. […]。 The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s)。

翻译过来的意思是 DISTINCT ON ( expression [, …] )把记录根据[, …]的值进行分组,分组之后仅返回每一组的第一行。需要注意的是,如果你不指定ORDER BY子句,返回的第一条的不确定的。如果你使用了ORDER BY 子句,那么[, …]里面的值必须靠近ORDER BY子句的最左边。

select distinct on(age) id,name,age,sex from xttblog;

上面这个语句,由于没有添加 ORDER BY 子句,所以就有可能在执行时报 SELECT DISTINCT ON expressions must match initial ORDER BY expressions。

另外如果指定了 ORDER BY 子句,但是 DISTINCT ON 中的字段不在 ORDER BY 语句的最左边,也会报 SELECT DISTINCT ON expressions must match initial ORDER BY expressions 错误。

select distinct on(age) id,name,age,sex from xttblog order by id,name;

以上,希望能够帮助到大家!如果还有疑问,欢迎添加我的微信,一起精进!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 解决 SELECT DISTINCT ON expressions must match initial ORDER BY expressions 的教程