SELECT DISTINCT ON (some_col) * FROM my_table
我想知道这是否有效并且是否会按预期工作。意思是,这是否会基于不同的返回 my_table 中的所有列some_col?我已经阅读了Postgres文档,没有看到任何无法正常运行的原因,但是在此处阅读了关于SO的旧注释,其中指出在使用不重复使用时必须显式列出列。
my_table
some_col
我知道最好的做法是明确列出列,并在执行上述操作时使用 order by。
您可能不需要或不关心的背景
对于背景和我问的原因,我们是从 MySQL 迁移到 Postgres。MySQL 有一个非常不符合标准的“技巧”,SELECT * ... GROUP BY它允许一个可以轻松地select *基于group by.以前关于将这种不符合标准的技巧迁移到 Postgres 的答案和评论充其量是模糊的。
SELECT * ... GROUP BY
select *
group by.
SELECT DISTINCT ON (some_col) * FROM my_table;
我想知道这是否有效
是的。通常,您希望ORDER BY使用它来确定从每组对等点中选择哪一行。但是选择任意行(没有ORDER BY)是一个有效的(有时是有用的!)应用程序。你只需要知道你在做什么。也许为来世添加评论?
看:
选择每个 GROUP BY 组中的第一行? 这是否会根据不同的 some_col 返回 my_table 中的所有列?
它将返回所有列。的每个不同值任意一行some_col。
请注意我如何使用“任意”一词,而不是“随机”。返回的行根本不是随机选择的。随意,取决于当前的实现细节。通常每个不同值的物理第一行,但这取决于。
我知道明确列出列是最佳做法。
这真的取决于。通常是这样。有时不是。就像我想让所有列匹配给定的行类型一样。