0

我有这样的东西。

\d 表1

uid |int (primary key)
name|text
cids|int[]

例子:

id   | name  | cids 
 1   | joe   |{10,20,30}
 2   | marry |{10,20,30,40}
 3   | john  |{30,40}

\d 表2

cid   |int (primary key)
name  |text
type  |int

例子

cid  | name  |  type
10   | aname | 0  
20   | bname | 0
30   | cname | 1
40   | dname | 0

现在我想要一个结果,如 id、table1 中的名称和 cid、表 2 中的名称。其中 type !=1

Example. 
id | name | cid      |cnames
1  | Joe | {10,20}   |{aname,bname}

请告诉我这样做的有效方法是什么。提前致谢。

4

1 回答 1

1

试试这个对于版本 < 9.0

SELECT A.id, A.name, 
array_agg(b.cid) cids,array_agg(B.name) cnames
FROM Table1 A
JOIN 
(
  SELECT * FROM Table2 ORDER BY cid
)
B ON B.cid = ANY(A.cids)
WHERE type <> 1
GROUP BY A.id, A.name;

(以下作品适用于版本 9+)

SELECT A.id, A.name, 
array_agg(b.cid order by b.cid) cids,
array_agg(B.name ORDER BY B.name) cnames
FROM Table1 A
JOIN Table2 B ON B.cid = ANY(A.cids)
WHERE type <> 1
GROUP BY A.id, A.name

SQL 演示在这里

于 2013-01-30T05:45:24.957 回答