sql - SELECT DISTINCT ON (col) * 有效吗?
问题描述
SELECT DISTINCT ON (some_col)
*
FROM my_table
我想知道这是否有效并且会按预期工作。意思是,这会返回 my_table 中的所有列,基于 distinctsome_col
吗?我已经阅读了 Postgres 文档,看不出有什么理由不能按预期工作,但是在这里阅读了关于 SO 的旧评论,其中指出在使用 distinct on 时需要明确列出列。
我知道最好的做法是明确列出列,并在执行上述操作时使用 order by。
您可能不需要或不关心的背景
对于背景和我问的原因,我们正在从 MySQL 迁移到 Postgres。MySQL 有一个非常不符合标准的“技巧”,SELECT * ... GROUP BY
它允许一个轻松地select *
基于group by
. 以前关于将这种不符合标准的技巧迁移到 Postgres 的答案和评论充其量是模糊的。
解决方案
SELECT DISTINCT ON (some_col) *
FROM my_table;
我想知道这是否有效
是的。通常,您希望ORDER BY
使用它来确定从每组对等点中选择哪一行。但是选择任意行(不带ORDER BY
)是有效的(有时很有用!)应用程序。你只需要知道你在做什么。也许为来世添加评论?
看:
这会根据不同的 some_col 返回 my_table 中的所有列吗?
它将返回所有列。每个不同的值一个任意行some_col
。
请注意我如何使用“任意”一词,而不是“随机”。返回的行根本不是随机选择的。只是任意的,取决于当前的实现细节。通常每个不同值的物理第一行,但这取决于。
我知道明确列出列是最佳做法。
这真的取决于。通常是这样。有时不是。就像我想让所有列匹配给定的行类型一样。
推荐阅读
- angular - 在组件之间发出更改并且不传递信息的最佳方式
- python - 带有 2D 投影的 3D 线框图:空间组织和投影频率
- reactjs - 警告:预期的服务器 HTML 包含匹配项在
- vue.js - 使用 JWT(JSON Web 令牌)保护 API 端点
- java - RMI 上的事务对象
- javascript - React forEach 不在 TSX 中打印 HTML
- python - Sum of specific group of columns for each row of a numpy array
- python - 向上移动行并重置索引熊猫数据框
- powershell - 活动目录通过powershell删除描述和office字段
- vb.net - 记录我想使用 vb.net 在相同的信封 id 中发送其他文件