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 by
的distinct 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 数据类型