将限制设置为array_agg()

时间:2012-09-19 15:12:35

标签: 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;

限制将影响行。我希望它将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" ;

这给我以下输出

{(13),(14),(15),(12)}

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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

或者如果您希望输出为数组:

SELECT (array_agg("Esns".id ))[1:2] as id_array
FROM public."Esns", 
     public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 

答案 1 :(得分:2)

结果中的引号是行类型的装饰器。您没有构建整行数组(恰好包含单个列)。请改用

此外,从查询结果中直接array construction通常更简单,更快捷:

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?
   )

如果您想获得稳定的结果和/或选择某些行,则需要ORDER BY。否则结果是任意的,并且可以随时改变。

在使用它时,我使用显式JOIN语法重写了查询,这通常是优选的,并使用别名来简化。