Отношение «многие ко многим»: поиск всех строк, имеющих отношение к набору строк из связанной таблицы - PullRequest
0 голосов
/ 02 мая 2018

Рассмотрим три таблицы, назовем их groups, subgroups, another_groups и таблицу subgroups_another_groups, которая задает отношение «многие ко многим» между subgroups и another_groups. subgroups и groups находятся в отношении один-ко-многим, поэтому subgroups имеет внешний ключ group_id.

Как можно выбрать another_groups, к которому относятся все subgroups в пределах group?

1 Ответ

0 голосов
/ 02 мая 2018

Я предполагаю, что вы говорите о такой настройке:

CREATE TABLE groups (
   id integer PRIMARY KEY
);

CREATE TABLE subgroups (
   id integer PRIMARY KEY,
   group_id integer REFERENCES groups NOT NULL
);
CREATE INDEX ON subgroups(group_id);

CREATE TABLE another_groups (
   id integer PRIMARY KEY
);

CREATE TABLE subgroups_another_groups (
   subgroup_id integer REFERENCES subgroups NOT NULL,
   another_groups_id integer REFERENCES another_groups NOT NULL,
   PRIMARY KEY(subgroup_id, another_groups_id)
);
CREATE INDEX ON subgroups_another_groups(another_groups_id);

Тогда вы хотите знать все another_groups, которые связаны с groups через две другие таблицы, кроме тех, где есть подгруппа, которая не имеет связи с этим another_groups, верно?

В SQL это будет выглядеть так:

SELECT DISTINCT g.id, a.id
FROM another_groups a
   JOIN subgroups_another_groups sag ON a.id = sag.another_groups_id
   JOIN subgroups s ON sag.subgroup_id = s.id
   JOIN groups g ON s.group_id = g.id
WHERE NOT EXISTS
         (SELECT 1 FROM subgroups s1
          WHERE s1.group_id = g.id
            AND NOT EXISTS
                   (SELECT 1 FROM subgroups_another_groups sag1
                    WHERE sag1.subgroup_id = s1.id
                      AND sag1.another_groups_id = a.id
                   )
         );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...