3

別のテーブルへの外部キーを持つごく普通のテーブルがあります。例えば:

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 を含むある種のリストが必要です。

どこかで、副選択では 1 つの列 (この場合は問題ありません)と 1 つの行しか得られないことを読んだことがあります(これは、上記のクエリが機能しないことを説明します)。これが本当なら、代わりにどのようにこれを行うことができますか? それとも、プログラム内SELECTのすべての行に対してリクエストを発行する必要があるのでしょうか?table_a

これを PostgreSQL 9.1 および 9.3 で動作させたいと考えています。

4

2 に答える 2

8

関数を使用できます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)
于 2015-04-14T11:55:54.393 に答える