2012-09-19 35 views
6

Aşağıdaki Postgres sorgu var:Seti sınırı array_agg için()

SELECT array_agg("Esns".id) 
FROM public."Esns", 
    public."PurchaseOrderItems" 
WHERE 
    "Esns"."PurchaseOrderItemId" = "PurchaseOrderItems".id 
    AND "PurchaseOrderItems"."GradeId"=2 
LIMIT 2; 

sınır satırları etkileyecektir. array_agg()'u 2 ürünle sınırlamak istiyorum. Aşağıdaki sorgu çalışır ama tırnak içinde her bir giriş ile benim çıktı alın:

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" ; 

Bu bana aşağıdaki çıktıyı

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

Herhangi bir fikir verir?

cevap

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 

veya dizi olarak çıktı istiyorsanız: sonuçta

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

Mükemmel. Teşekkürler. İkinci cevap, bir dizi istediğim gibi aradığım şeydi ve sınırın üst sınırını dinamik olarak ayarlamak istiyorum. Teşekkür ederim. – user1175817

+0

Güzel olan. İkinci örnek nokta! –

2

tırnak satır türü için dekoratörler vardır. Bir dizi tam satır oluşturmuyorsunuz (tek bir sütun içerecek şekilde). Bunun yerine sütun kullanın. Ayrıca

, bir sorgu sonucundan array construction direkt tipik basit ve hızlıdır: Bir istikrarlı bir sonuç istiyor ve/veya belirli satırları seçtiğinizde ORDER BY şeye gerek

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

. Aksi halde sonuç keyfi ve herhangi bir zamanda değişebilir.

Bu sırada, genel olarak tercih edilen ve basitleştirmek için diğer adlar kullanılan açık JOIN sözdizimi ile sorguyu yeniden yazdım.