SELECT DISTINCT ON(col)*有效吗?
技术问答
524 人阅读
|
0 人回复
|
2023-09-12
|
SELECT DISTINCT ON (some_col)*FROM my_table我想知道这是否有效,是否会按预期工作。这意味着它是否会基于不同的返回 my_table 中的所有列some_col?我已经读过了Postgres文档,没有看到任何不能正常运行的原因,但在这里阅读了关于SO旧注释指出,不重复使用时必须显式列出。1 _) l0 `6 z. C
我知道最好的方法是明确列出列表,并在执行上述操作时使用 order by。! g0 s0 M# d& W, C) M4 p
你可能不需要或不在乎背景, _) E6 c' E, h. z* a u
我问的背景和原因是 MySQL 迁移到 Postgres。MySQL 有一个非常不符合标准的技能,SELECT * ... GROUP BY它允许一个人很容易select *基于group by.将这种不符合标准的技能迁移到 Postgres 的答案和评论充其量是模糊的。
! U, k' k; U2 q. w9 m7 ~( d $ H6 u* J* d }$ Y2 a
解决方案:
4 Z k1 h9 j. g8 d, F# u SELECT DISTINCT ON (some_col) *FROM my_table;我想知道这是否有效
! t @9 M9 O6 C6 ?是的。通常,你希望ORDER BY用它来确定从每组对等点中选择哪一行。但是选择任意行(没有ORDER BY)有效(有时有用)!)应用程序。你只需要知道你在做什么。也许给来世添加评论?1 Y/ z" R X3 ~$ P# V C- _$ `
看:
" ]% _( X- I) l选择每个 GROUP BY 组第一行?
. j; {% g5 e) q9 F1 d这是否会取决于不同的 some_col 返回 my_table 中的所有列?/ c& }$ m6 O6 T4 ^) U& m: c6 a
它将返回所有列。任何一行的每个不同值some_col。
2 Y, F( ?5 H7 X- S, e请注意我如何使用任意这个词,而不是随机。返回的线根本不是随机选择的。随机性取决于当前的实现细节。通常,每个不同值的物理第一行,但这取决于。
# ]3 {! M2 E: |( D7 ~我知道明确列出列是最好的方法。$ p9 S0 v2 P- @5 T0 B% |
这真的取决于。通常是这样。有时不是。就像我想让所有列匹配给定的行类型一样。 |
|
|
|
|
|