我们有一个组
和用户权限
表如下:
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
的用户缺少插入权限 ..
其他组类似。
有没有更好的方法来编写上面的查询。如何优化?
最佳答案
在我的解决方案中,我从表 Group
和 UserPermission
中获取笛卡尔积(仅限唯一用户 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/