sql - 删除 "NOT IN"子句并优化查询

标签 sql sql-server tsql query-optimization sql-insert

我们有一个用户权限表如下:

Group (group_id,name)
01 | G1
02 | G2
03 | G3
04 | G4

UserPermission (userid,group_id,active)
User1 | 01 | 1
User1 | 02 | 1
User2 | 01 | 1
User2 | 02 | 1
User2 | 03 | 1
User2 | 04 | 1
..
UserN | xx | 1

每个用户都有一个的权限。
但是 UserPermission 表中缺少某些用户的某些权限。

问题是为 UserPermission 表中存在的所有用户插入缺少的组权限条目。

所以我提出的查询是 (粗)

 insert into UserPermission 
         select distinct userid, '03', 1 from UserPermission  
         where userid not in (
               select userid from UserPermission where group_id = '03'
         )

这是因为 Group 03 的用户缺少插入权限 ..
其他组类似。

有没有更好的方法来编写上面的查询。如何优化?

最佳答案

在我的解决方案中,我从表 GroupUserPermission 中获取笛卡尔积(仅限唯一用户 ID)。然后使用 LEFT JOIN 将两个表的产品连接回表 UserPermission,前提是它匹配两列:Group_ID用户名。任何不满足条件的记录都将在 UserPermission 的列上具有 NULL 值。这些值是 UserPermission 表中缺失的值。

这还将为所有用户填充所有缺少的权限

INSERT INTO UserPermission(userID, group_ID, active)
SELECT  b.userID, a.Group_ID, 1
FROM    [Group] a
        CROSS JOIN (SELECT DISTINCT userID FROM UserPermission) b
        LEFT JOIN UserPermission c
            ON a.Group_ID = c.Group_ID AND
                b.userID = c.UserID
WHERE   c.Group_ID IS NULL

但是如果你只想插入特定的Group_ID,那么你需要额外的条件。

INSERT INTO UserPermission(userID, group_ID, active)
SELECT  b.userID, a.Group_ID, 1
FROM    [Group] a
        CROSS JOIN (SELECT DISTINCT userID FROM UserPermission) b
        LEFT JOIN UserPermission c
            ON a.Group_ID = c.Group_ID AND
                b.userID = c.UserID
WHERE   c.Group_ID IS NULL AND
        a.Group_ID = 3
        -- or change it to IN clause
        -- if you have more Group_ID to include
        -- a.Group_ID IN (3,4)

关于sql - 删除 "NOT IN"子句并优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746293/

相关文章:

mysql - 如何更改 MySQL 中的 SHOW GRANTS 标题?

mysql - 删除和更新时的默认值是什么

java - 外键抛出 ConstraintViolationException

SQL Server 获取序列的多个下一个值

asp.net - 在 asp.net 中动态加载 CSS 元素

c# - 批量复制错误 : The locale id '1025' of the source column 'CreatedBy' and the locale id '1033' of the destination column 'CreatedBy' do not match

tsql - 尝试在 T-SQL 查询中使用 Levenshtein 距离 - 请帮助优化

sql - 合并查询结果中的记录

c# - 实时监控网络状态。引发了哪些事件?

sql - 需要在 SQL Server 中透视字符串值