Котики, а помогите пожалуйста с SQL, никак не могу придумать как оптимально составить запрос.
Есть таблица А, B и С.
В держит в себе m2m отношение между А и С.
Я хочу составить запрос такого рода: дай мне строки из таблицы А, если о них в таблице В нет ссылок, или если есть - чтобы в них была ссылка на конкретное значение в С.
Пока решается топорным “NOT EXISTS (...) OR EXISTS (...)”, но почему то в голову ничего умнее не приходит
Может у кого есть идеи?
```
CREATE TABLE A (
id SERIAL NOT NULL.
name VARCHAR(64) NOT NULL,
CONSTRAINT a_pk PRIMARY KEY (id)
);
CREATE TABLE A2B (
a_id INT NOT NULL.
b_id INT NOT NULL,
CONSTRAINT a2b_pk PRIMARY KEY (a_id, b_id),
CONSTRAINT a2b_a_fk FOREIGN KEY (a_id) REFERENCES a(id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT a2b_a_fk FOREIGN KEY (a_id) REFERENCES a(id) ON DELETE CASCADE ON UPDATE CASCADE,
)
CREATE TABLE B (
id SERIAL NOT NULL.
name VARCHAR(64) NOT NULL,
CONSTRAINT b_pk PRIMARY KEY (id)
);
WITH a_not_included AS (
SELECT b_id, a_id FROM A, A2B, B WHERE
A2B.b_id =
B.id AND
A2B.a_id !=
A.id), a_included AS (SELECT b_id, a_id FROM A, A2B, B WHERE
A2B.b_id =
B.id AND
A2B.a_id =
A.id)
SELECT b_id, array_agg(a_not_included.a_id), array_agg(a_included) FROM a_not_included, a_included WHERE a_included.b_id = a_not_included.b_id GROUP BY b_id;