PostgreSQL多聚合数组

PostgreSQL多聚合数组,postgresql,aggregate-functions,Postgresql,Aggregate Functions,我有四张桌子 TABLE_A ---------------- ID AName1 AName2 1 A11 A12 2 A21 A22 3 A31 A32 TABLE_B ------------ AID ID BName 1 B11 Ba11 1 B12 Ba12 1 B13 Ba13 1 B14 Ba14 2 B21 Ba21 2 B22 Ba22 3 B31 Ba31 TABLE_C ---------------- AID BID

我有四张桌子

TABLE_A
----------------
ID AName1 AName2
1  A11    A12
2  A21    A22
3  A31    A32

TABLE_B
------------
AID ID BName
1   B11 Ba11
1   B12 Ba12
1   B13 Ba13
1   B14 Ba14
2   B21 Ba21
2   B22 Ba22
3   B31 Ba31

TABLE_C
----------------
AID BID ID CName
1   B11 C11 Ca11
1   B11 C12 Ca12
1   B11 C13 Ca13
1   B12 C14 Ca14
1   B13 C15 Ca15
1   B13 C16 Ca16
1   B14 C17 Ca17
1   B14 C18 Ca18
1   B14 C19 Ca19
2   B21 C20 Ca20
2   B21 C21 Ca21
2   B22 C22 Ca22
2   B22 C23 Ca23
2   B22 C24 Ca24
2   B22 C25 Ca25

TABLE_D
----------------
AID BID ID DName
1   B11 D1  Da1
1   B11 D2  Da2
1   B11 D3  Da3
1   B12 D4  Da4
1   B12 D5  Da5
1   B13 D6  Da6
1   B13 D7  Da7
1   B13 D8  Da8
1   B13 D9  Da9
1   B14 D10 Da10
2   B21 D11 Da11
2   B21 D12 Da12
2   B21 D13 Da13
2   B22 D14 Da14
2   B22 D15 Da15
给定一对AName1和AName2,我想得到BName的唯一值以及相应的CName和DName数组

例如,给定AName1=A21和AName2=A22,我希望得到以下结果:

BName CName                    DName
B21   {Ca20, Ca21}             {Da11, Da12, Da13}
B22   {Ca22, Ca23, Ca24, Ca25} {Da14, Da15}
我当前正在使用以下查询:

SELECT
b.BName,
array_agg(c.CName),
array_agg(d.DName)
FROM
TABLE_B
INNER JOIN
TABLE_A on b.AID=TABLE_A.ID
LEFT JOIN
TABLE_C c on c.BID = b.ID 
LEFT JOIN
TABLE_D d on d.BID=b.ID
WHERE
TABLE_A.AName1 like 'A21' AND
TABLE_A.AName2 like 'A22'
GROUP BY
b.ID
这是重复值,就好像它也在C和D上分组一样:

BName CName                                DName
B21   {Ca20, Ca20, Ca20, Ca21, Ca21, Ca21} {Da11, Da12, Da13, Da11, Da12, Da13}
有人知道我可以如何纠正这个问题吗?我正在使用PostgreSQL 9.2版。

select
    b.bname,
    array_agg(distinct c.cname),
    array_agg(distinct d.dname)
from
    table_b b
    inner join
    table_a a on b.aid = a.id
    left join
    table_c c on c.bid = b.id
    left join
    table_d d on d.bid = b.id
where
    a.aname1 = 'A21' and
    a.aname2 = 'A22'
group by b.bname