SELECT DISTINCT ON (col) * 有效吗?

Posted

技术标签:

【中文标题】SELECT DISTINCT ON (col) * 有效吗?【英文标题】:Is SELECT DISTINCT ON (col) * valid? 【发布时间】:2021-08-17 02:46:51 【问题描述】:
SELECT DISTINCT ON (some_col)
*
FROM my_table

我想知道这是否有效并且会按预期工作。意思是,这是否会根据不同的some_col 返回 my_table 中的所有列?我已经阅读了 Postgres 文档,看不出有任何理由说明这个 不会 按预期工作,但是在 SO 上阅读了 old cmets,其中指出在使用 distinct 时需要明确列出列开。

我知道明确列出列是最佳做法,并且在执行上述操作时也使用 order by。

您可能不需要或不关心的背景

对于背景和我问的原因,我们正在从 mysql 迁移到 Postgres。 MySQL 有一个非常不符合标准的“技巧”,它允许SELECT * ... GROUP BY 允许基于group by 轻松select *。以前关于将这种不符合标准的技巧迁移到 Postgres 的答案和 cmets 充其量是模糊的。

【问题讨论】:

这是有效的语法,但没有order bydistinct on () 几乎没有意义 【参考方案1】:
SELECT DISTINCT ON (some_col) *
FROM   my_table;

我想知道这是否有效

是的。通常,您希望ORDER BY 使用它来确定从每组对等点中选择哪一行。但是选择任意行(没有ORDER BY)是一个有效的(有时是有用的!)应用程序。你只需要知道你在做什么。也许为来世添加评论?

见:

Select first row in each GROUP BY group?

这是否会根据不同的 some_col 返回 my_table 中的所有列?

它将返回所有列。 some_col 的每个不同值对应一个任意行。

请注意我如何使用“任意”一词,而不是“随机”。返回的行根本不是随机选择的。只是任意的,取决于当前的实现细节。通常是每个不同值的物理第一行,但这取决于。

我知道明确列出列是最佳做法。

这真的取决于。通常是这样。有时不是。就像我想让所有列都匹配给定的行类型一样。

【讨论】:

以上是关于SELECT DISTINCT ON (col) * 有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 SELECT DISTINCT ON 与 OrmLite 一起使用

在不使用子查询的情况下使用 SELECT DISTINCT ON 计算总行数

如何解决 不能以 DISTINCT 方式选择 textntext 或 image 数据类型

update base on select (Sql Server)

SQL中DISTINCT的位置

MySQL — 关键字和增删改查