一尘不染

SELECT DISTINCT ON(col)*有效吗?

sql

SELECT DISTINCT ON (some_col)
*
FROM my_table

我想知道这是否有效并且是否会按预期工作。意思是,这是否会基于不同的返回 my_table 中的所有列some_col?我已经阅读了Postgres文档,没有看到任何无法正常运行的原因,但是在此处阅读了关于SO的旧注释,其中指出在使用不重复使用时必须显式列出列。

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

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

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


阅读 111

收藏
2021-05-30

共1个答案

一尘不染

SELECT DISTINCT ON (some_col) *
FROM   my_table;

我想知道这是否有效

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

看:

选择每个 GROUP BY 组中的第一行?
这是否会根据不同的 some_col 返回 my_table 中的所有列?

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

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

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

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

2021-05-30