这两个类似的SQL ARRAY_TO_STRING语句有什么区别?

时间:2017-06-06 20:32:06

标签: sql ruby-on-rails

我在我的SQL查询中嗅出了一个围绕ARRAY_AGG函数的错误。下面是以下两行SQL。

以下行是我最终希望拥有的正确且完整的SQL版本。此行为是导致正确查询的行为。

ARRAY_TO_STRING((ARRAY_AGG(R.version ORDER BY R.released_on DESC))[1:10], ', ')

这一行在这里我认为是等价的,但是当我执行这行SQL时,我会收到ERROR: more than one row returned by a subquery used as an expression

ARRAY_TO_STRING(ARRAY_AGG((SELECT  "releases"."version" FROM "releases"  ORDER BY "releases"."released_on" DESC LIMIT 10)), ',')

我通过arel到达这一行的SQL并且证明有点挑战但是两行可能是等价的吗?第一行是切片数组以检索10个项目,而第二行基本上是做同样的事情,尽管是行。这可能会被调整,还是需要重写?

1 个答案:

答案 0 :(得分:0)

我还没有使用红宝石,但它看起来像是两条线之间不同的嵌套。您的ARRAY_AGG正在获取两组不同的数据。
第一:

ARRAY_AGG(R.version ORDER BY R.released_on DESC)

第二

ARRAY_AGG((SELECT  "releases"."version" FROM "releases"  ORDER BY "releases"."released_on" DESC LIMIT 10))

在那里我认为你的第二个陈述是错误的,从我在网上看到的看起来ARRAY_AGG看起来应该用作不在表集上的列函数。以下是我正在查看的一些链接,但我不确定哪个是正确的,因为ARRAY_AGG看起来像是一个sql函数而且我不确定你使用的是什么味道...

https://msdn.microsoft.com/en-us/library/azure/mt763803.aspx
https://www.postgresql.org/docs/8.4/static/functions-aggregate.html

我认为它应该是这样的:

(SELECT  ARRAY_AGG("releases"."version") FROM "releases"  ORDER BY "releases"."released_on" DESC LIMIT 10)

只是一个猜测..