sql - 在两次选择中为每对插入记录

标签 sql sql-server oracle postgresql sql-insert

目前我有 3 张 table 。假设用户、权限和链接它们的表(由于 nn 的关系)可以称为 usr_prm。现在我有一组用户应该获得某些权限。我可以根据 sql 选择来定义这两个组。但现在我想知道有没有办法在单个插入查询中执行此操作?到目前为止,我提出了以下解决方案,但这意味着运行 x 查询,其中 x 是我需要添加的权限数。

为了增加复杂性,我可以说这组用户是根据他们已经分配的权限来选择的。因此我们可以简单地表达为:向已经拥有权限 PERM_1 的用户添加一组权限(即 PERM_1_1、PERM_1_2)。

我现在正在使用 PostgreSQL 数据库,但我希望有一个通用的解决方案,因为我们的应用程序还支持某些客户的 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 ...

最佳答案

这是你想要的吗?

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 表,除非其他条件需要它。

关于sql - 在两次选择中为每对插入记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117047/

相关文章:

大于参数的可空数字的sql查询

c++ - 如何在 C++ 中以十六进制代码打印 unicode 字符

sql - 使用联接对多列进行累积总和

sql - 使用 SERIAL 主键插入或更新表

sql - 使用for循环在oracle sql中更新多行

sql - 在 case 表达式中使用 select 子句来设置条件

sql - 计算Oracle中两个时间戳之间的差异(以毫秒为单位)

sql - 如何通过恢复从sql 2000迁移到sql 2008?

sql - SELECT SQL 查询帮助

sql-server - 查找 SQL Server 中表的 B 树高度