Tsql 查找3个表之间缺少的值

Tsql 查找3个表之间缺少的值,tsql,Tsql,我有3个表:权限、角色和角色权限。我希望有一种方法可以根据RolePermissions表关系选择权限表中缺少新行的角色,以便在添加新权限后插入这些值 我一直没有找到如何做到这一点,这就是为什么我在这里问 表结构 Permissions | Roles | RolePermissions ------------------------------------------ Id | Id | Id Name | Name | RoleId

我有3个表:权限、角色和角色权限。我希望有一种方法可以根据RolePermissions表关系选择权限表中缺少新行的角色,以便在添加新权限后插入这些值

我一直没有找到如何做到这一点,这就是为什么我在这里问

表结构

Permissions | Roles | RolePermissions
------------------------------------------
Id          | Id    | Id
Name        | Name  | RoleId
            |       | PermissionId
sql的概念,但我知道它不正确:

-- Looking to be able to do something like
INSERT INTO RolePermissions (RoleId, PermissionId)
SELECT missingpermissions.PermissionId, missingpermissions.RoleId
FROM Permissions as p
INNER JOIN(
Select r.Id as RoleId,  p.Id as PermissionId
    FROM Role as r
    LEFT JOIN RolePermissions as rp
        ON r.Id = rp.RoleId
    WHERE rp.PermissionId = p.Id
) as missingpermissions 
ON p.id = missingpermissions.permissionid

编辑为格式化

您需要获得新权限并交叉加入所有角色(以获得角色和新权限的所有组合)


请阅读一些关于改进您的问题的提示。它涵盖了您正在使用的数据库软件、提供DDL和示例数据、预期结果、您尝试了什么以及您无法解决的问题等内容。旁白:如果你添加了一个新的权限,不是所有的角色都会丢失吗?@Ralph抱歉,我误读了你的问题,所以我删除了我的答案。示例数据和预期的输出在这里非常有用。“权限中缺少新行的角色”,但角色不在权限表中。那整个句子很令人困惑。不过你的桌子结构很清楚。请分享一个导致此问题的示例“我在角色1的
RolePermissions
表中插入新权限,但我希望
permissions
也能获得已创建的新权限…”?很抱歉给你带来了困惑。基本上,当一个新的权限添加到权限表中时,我想将每个角色的新权限添加到角色权限表中。谢谢。这正是我所需要的。旁白:由于OP未定义new,我们无法说出他们真正的想法,但此查询将为
RolePermissions
中没有角色的任何权限添加所有角色。如果一个人不时地删除这个奇怪的角色/权限,并且幸运的是,最终得到一个没有剩余角色的权限,那么这个查询将重新填充该表。
INSERT INTO RolePermissions(RoleId, PermissionId)
    SELECT r.ID AS RoleId,p.ID AS PermissionId
    FROM Role r
    CROSS JOIN (
       --get all permissions currently not assigned to a role (presumably "new")
       select p.*
       from Permissions p
       left join RolePermissions rp on p.id=rp.PermissionId
       where rp.PermissionId is null
    ) p