array_agg保证Postgres中多列的一致性?

时间:2016-04-01 03:41:56

标签: postgresql

假设我在Postgres 9.4中有以下表格:

 a | b 
---+---
 1 | 2
 3 | 1
 2 | 3
 1 | 1

如果我跑

 select array_agg(a) as a_agg, array_agg(b) as b_agg from foo

我得到了我想要的东西

   a_agg   |   b_agg   
-----------+-----------
 {1,3,2,1} | {2,1,3,1}

两个数组的顺序是一致的:每个数组的第一个元素来自单行,第二个元素也是第三个元素。我实际上并不关心数组的顺序,只是它们在列之间是一致的。

这似乎很自然,只会发生#34;而且似乎。但它可靠吗?通常,除非指定了ORDER BY子句,否则SQL事物的顺序是不确定的。完全有可能使postgres在array_agg中生成不一致的ORDER BY子句的配对(有一些明显适得其反的额外工作):

select array_agg(a order by b) as agg_a, array_agg(b order by a) as agg_b from foo;

产量

   agg_a   |   agg_b   
-----------+-----------
 {3,1,1,2} | {2,1,3,1}

这不再一致。第一个数组元素3和2不是来自同一个原始行。

我想确定,如果没有任何ORDER BY子句,自然就会发生。即使对任一列进行排序,由于重复元素,仍然存在歧义。我宁愿避免强加一种明确的排序,因为在我的实际应用程序中,表格会很大,排序可能会很昂贵。但我无法找到任何保证或指明的文档,如果没有强加不一致的排序,将会一致地订购多个array_agg来电,即使如果他们不是这样,也会非常令人惊讶。吨。

如果在查询或聚合函数中没有明确排序时,可以安全地假设多个array_agg列的排序将一致排序吗?

1 个答案:

答案 0 :(得分:1)

根据PostgreSQL documentation

  

通常,输入行以未指定顺序的形式提供给聚合函数。 [...]

     

但是,某些聚合函数(例如 array_agg 和string_agg)会产生依赖于输入行的排序的结果。使用此类聚合时,可选的 order_by_clause可用于指定所需的排序

我理解它的方式:您不能确定行的顺序是,除非您使用ORDER BY