SQL RIGHT JOIN запрос, чтобы включить всех детей? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть таблицы 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;

Но, похоже, это не дает мне того, чего я хочу.

1 Ответ

2 голосов
/ 14 марта 2020

Используйте left join - логи c просто следовать: сохраняйте все строки в первой таблице, которую вы видите в предложении from.

Тем не менее, вы не кажетесь нужно внешнее соединение. Вы просто хотите группы, которые имеют "2". Это предполагает предложение HAVING:

SELECT a.*, ARRAY_AGG(abm.b_id)
FROM A a JOIN
     A_B_MEMBERS abm
     ON a.a_id = abm.a_id
GROUP by a.a_id
HAVING COUNT(*) FILTER (WHERE abm.b_id = 2) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...