У меня есть таблицы A
, B
и таблица A_B_MEMBERS
, которая связывает A
и B
. A
может иметь несколько B
, а B
может иметь несколько A
. Рассмотрим следующие конкретные схемы таблиц:
CREATE TABLE A (
a_id INT PRIMARY KEY,
data TEXT
)
CREATE TABLE B (
b_id INT PRIMARY KEY,
data TEXT
)
CREATE TABLE A_B_MEMBERS (
a_id NOT NULL REFERENCES A(a_id),
b_id NOT NULL REFERENCES B(b_id),
PRIMARY KEY (a_id, b_id)
)
Учитывая b_id
, я хочу запросить все A
с этим b_id
, но также вернуть все другие b_id
с A
содержит. Итак, рассмотрим следующий пример:
a_id | data
-----+-----
1 | "hi"
2 | "hello"
3 | "cao"
b_id | data
-----+-----
1 | "people"
2 | "world"
3 | "foo"
a_id | b_id
-----+-----
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
3 | 3
Итак, a_id=1
имеет b_id={1,2,3}
, a_id=2
имеет b_id={1,2}
, a_id=3
имеет b_id={3}
.
Учитывая, скажем b_id=2
, возвращаемое значение должно быть:
a_id | data | b_id_arr
-----+----------+---------
1 | "hi" | {1,2,3}
2 | "hello" | {1,2}
Я не могу сделать это через объединения таблиц и вынужден выполнить два отдельных запроса. Я пробовал следующее:
SELECT
a.*,
ARRAY_AGG(abm.b_id) b_id_arr
FROM A a
RIGHT JOIN A_B_MEMBERS abm
ON a.a_id = abm.a_id
AND abm.b_id = 2
GROUP by a.a_id;
Но, похоже, это не дает мне того, чего я хочу.