Postgresql 获取每行的列表值(来自另一个表的ID列表)

Postgresql 获取每行的列表值(来自另一个表的ID列表),postgresql,sql-subselect,Postgresql,Sql Subselect,我有一个非常普通的表,外键指向另一个表;例如: CREATE TABLE table_a ( id serial NOT NULL, name text, CONSTRAINT table_a_pkey PRIMARY KEY (id) ); CREATE TABLE table_b ( id serial NOT NULL, a_id integer, -- The foreign key CONSTRAINT table_b_pkey PRIMARY KE

我有一个非常普通的表,外键指向另一个表;例如:

CREATE TABLE table_a (
  id serial NOT NULL,
  name text,
  CONSTRAINT table_a_pkey PRIMARY KEY (id)
);
CREATE TABLE table_b (
  id serial NOT NULL,
  a_id integer,       -- The foreign key
  CONSTRAINT table_b_pkey PRIMARY KEY (id),
  CONSTRAINT table_b_a_id_fkey FOREIGN KEY (a_id)
      REFERENCES table_a (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);
INSERT INTO table_a
     VALUES (1, 'First row');
-- 2 entries in table_b which refer to the existing table_a row:
INSERT INTO table_b
     VALUES (11, 1), (12, 1);
现在我想要一个视图,它为我提供了一个列表,其中列出了引用当前
table_a
行的
table_b
行的所有ID:

SELECT a.name,
       (SELECT b.id
          FROM table_b b
         WHERE b.id = a.id) AS b_ids
  FROM table_a a;
但是,
b_id
列为空;我想要一个列表,包含值11和12

在某个地方,我读到subselect只能生成一列(在本例中对我来说是可以的)和一行(这可以解释上面的查询对我不起作用)。如果这是真的,那怎么做呢?或者我真的需要为程序中的每一行
表发出
选择
请求吗


我希望这能与PostgreSQL 9.1和9.3配合使用。

您可以使用
array\u agg
函数:

select name
      ,string_agg(b.id::text,',') b_ids 
from table_a join table_b b on table_a.id= b.a_id
group by name
SELECT table_a.name, array_agg(table_b.id)
FROM table_a
LEFT OUTER JOIN table_b
ON table_a.id = table_b.a_id
GROUP BY table_a.name;

┌───────────┬───────────┐
│   name    │ array_agg │
├───────────┼───────────┤
│ First row │ {11,12}   │
└───────────┴───────────┘
(1 row)

只是显示你的预期结果??你想把
11和12
放在一行还是两行?我想有一行,包含
name
=
“第一行”
b_id
类似于
(11,12)
。你想把字符串_agg(id,,”)放在(按id划分)之上,我想我更喜欢一个真正的列表;如果其他操作都失败,将ID连接到逗号分隔的字符串可能是一个可接受的解决方法。谢谢,这很有效!使用
左外部联接
而不是子选择有什么特殊原因吗?我的外键不是
非空
,但此查询将忽略它为
的行,对吗?因此,马丁的答案更好。