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

时间:2015-04-14 11:43:23

标签: 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 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_b行的所有ID,这些行引用了当前的table_a行:

SELECT a.name,
       (SELECT b.id
          FROM table_b b
         WHERE b.id = a.id) AS b_ids
  FROM table_a a;

但是,b_ids列为空;我希望在那里有一些列表,包含值11和12。

在某处,我读到子选择只能产生一列(在这种情况下对我来说没问题)并且只有一行(这可以解释上述查询对我不起作用)。如果这是真的 - 如何才能做到这一点呢?或者我是否真的需要为程序中的每一行SELECT发出table_a次请求?

我希望使用PostgreSQL 9.1和9.3。

2 个答案:

答案 0 :(得分:6)

您可以使用array_agg功能:

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)

答案 1 :(得分:0)

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