2012-09-19 6 views
6

나는 다음 포스트 그레스 쿼리가 있습니다설정 제한 array_agg()의

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

어떤 아이디어를 줄?

답변

6
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 
+0

완벽합니다. 감사. 두 번째 대답은 배열을 원했기 때문에 내가 찾고 있던 것이고 동적으로 상한을 설정할 수 있기를 원합니다. 고맙습니다. – user1175817

+0

좋은 것. 두 번째 예는 바로 위에 있습니다! –

2

따옴표가 행의 형태에 장식됩니다. 전체 행 (하나의 열을 포함하는 배열)을 구성하지 않습니다. 대신 을 사용하십시오. 또한

는 쿼리 결과에서 array construction 직접 일반적으로 간단하고 빠른 : 당신이 안정적인 결과를 원하는 및/또는 특정 행을 선택하는 경우가 ORDER BY 뭔가가 필요

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

. 그렇지 않으면 결과는 임의적이며 언제든지 변경할 수 있습니다.

일반적으로 선호되는 명시 적 JOIN 구문을 사용하여 쿼리를 다시 작성하고 단순화하기 위해 별칭을 사용했습니다.