Вставить запись для каждой пары в два выбора - PullRequest
0 голосов
/ 02 ноября 2018

В настоящее время у меня есть 3 таблицы. Допустим, пользователи, разрешения и таблица связывают их обоих (из-за отношения n к n), которые можно назвать usr_prm. Теперь у меня есть группа пользователей, которая должна получить определенный набор разрешений. Я могу определить обе группы с точки зрения выбора SQL. Но теперь мне интересно, есть ли способ сделать эту операцию в одном запросе вставки? До сих пор я придумал следующее решение, но это означает выполнение x запросов, где x - это количество разрешений, которое мне нужно добавить.

Чтобы добавить к сложности, я могу сказать, что набор пользователей выбирается на основе их уже назначенных разрешений. Таким образом, мы можем выразить это просто как: Добавить набор разрешений (т.е. PERM_1_1, PERM_1_2) для пользователей, которые уже имеют разрешение PERM_1.

Сейчас я использую PostgreSQL DB, но я надеюсь, что есть универсальное решение, потому что наше приложение также поддерживает базы данных SQL Server и Oracle для некоторых клиентов, и может оказаться полезным использовать этот сценарий и на их базах данных.

Что я сейчас использую:

insert into usr_prm (user_id, permission_id)
select users.id, (select id from permissions where name="PERM_1_1")
from users
    inner join usr_prm on usr_prm.user_id = users.id
    inner join permissions on permissions.id = usr_prm.permission_id
where permissions.name = "PERM_1"
  and ...

insert into usr_prm (user_id, permission_id)
select users.id, (select id from permissions where name="PERM_1_2")
from users
    inner join usr_prm on usr_prm.user_id = users.id
    inner join permissions on permissions.id = usr_prm.permission_id
where permissions.name = "PERM_1"
  and ...

1 Ответ

0 голосов
/ 02 ноября 2018

Это то, что вы хотите?

insert into usr_prm (user_id, permission_id)
    select up.user_id, p2.id
    from usr_prm up inner join
         permissions p
         on p.id = up.permission_id cross join
         (select p2.*
          from permissions p2
          where p2.name in ('PERM_1_1', 'PERM_1_2', . . .)
         ) p2
    where p.name = 'PERM_1';

Исходя из вашего примера кода, вам не нужна таблица users, если только это не требуется для дополнительных условий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...