SELECT DISTINCT ON (col) * 有效吗?

Is SELECT DISTINCT ON (col) * valid?

SELECT DISTINCT ON (some_col)
*
FROM my_table

我想知道这是否有效,是否会按预期工作。意思是,这 return 来自 my_table 的所有列是否基于不同的 some_col?我已经阅读了 Postgres 文档,但没有看到任何 不会 按预期工作的原因,但是已经阅读了关于 SO 的旧评论,其中声明需要明确列出列当使用 distinct on 时。

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

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

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

SELECT DISTINCT ON (some_col) *
FROM   my_table;

I'm wondering if this is valid

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

参见:

  • Select first row in each GROUP BY group?

will this return all columns from my_table, based on distinct some_col?

它将 return 所有列。每个 some_col.

的不同值一个任意行

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

I do know it's best practice to explicitly list columns.

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