use*_*817 11 sql arrays postgresql limit
我有以下Postgres查询:
SELECT array_agg("Esns".id )
FROM public."Esns",
public."PurchaseOrderItems"
WHERE
"Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id
AND "PurchaseOrderItems"."GradeId"=2
LIMIT 2;
Run Code Online (Sandbox Code Playgroud)
限制将影响行.我希望它限制array_agg()为2项.以下查询有效,但我在输出中输入每个条目:
SELECT array_agg ("temp")
FROM (
SELECT "Esns".id
FROM public."Esns",
public."PurchaseOrderItems"
WHERE
"Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id
AND "PurchaseOrderItems"."GradeId"=2
LIMIT 4
) as "temp" ;
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出
{(13),(14),(15),(12)}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Clo*_*eto 11
select id[1], id[2]
from (
SELECT array_agg("Esns".id ) as id
FROM public."Esns",
public."PurchaseOrderItems"
WHERE
"Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id
AND "PurchaseOrderItems"."GradeId"=2
) s
Run Code Online (Sandbox Code Playgroud)
或者如果您希望输出为数组:
SELECT (array_agg("Esns".id ))[1:2] as id_array
FROM public."Esns",
public."PurchaseOrderItems"
WHERE
"Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id
AND "PurchaseOrderItems"."GradeId"=2
Run Code Online (Sandbox Code Playgroud)
结果中的括号(不是“引号”)是行文字的装饰器。您正在构建一个整行数组(恰好只包含一列)。相反,仅聚合列。
此外,从查询结果直接构建数组通常更简单、更快:
SELECT ARRAY (
SELECT e.id
FROM public."Esns" e
JOIN public."PurchaseOrderItems" p ON p.id = e."PurchaseOrderItemId"
WHERE p."GradeId" = 2
-- ORDER BY ???
LIMIT 4 -- or 2?
)
Run Code Online (Sandbox Code Playgroud)
ORDER BY如果您想要稳定的结果和/或选择某些行,您需要做一些事情。否则,结果是任意的,并且可能会随着下一次调用而改变。
在执行此操作时,我使用显式 JOIN 语法重写了查询(这通常是更可取的),并使用表别名来简化。