从一个 table 插入到另一个问题

Inserting from one table to another issue

我在尝试使以下存储过程工作时遇到问题。我有一个 table 个用户组,其中包含一个 user_id 和一个 group_id。两个 id 都设置为主键而不是 null。我想要做的是将当前在组列表中的所有用户插入此 table 到此 table。为了更清楚,我正在尝试执行以下操作:

groupIds 50、52、53 中的用户将他们插入组 40。

目前存储过程给了我一个 PRIMARY KEY 约束 'PK_user_groups'。无法在对象中插入重复键 ... 重复键值为 (3, 40)。当我查看 user_groups table 时,我确实看到了 3、40 的记录,但是组 40 还包含用户 5、8、10。我希望将用户 5、8、10 添加到组中40,但由于用户 3 已有记录而失败。

这是我的存储过程:

@targetGroupId int,
@groupList nvarchar(max)

DECLARE @list TABLE (groupId int);
    
INSERT INTO @list
SELECT * FROM SplitToInt(@grouplist, ',');

INSERT INTO user_groups(userId, groupId)
SELECT ug.userId, @groupId 
FROM user_groups ug 
INNER JOIN @list l ON ug.groupId = l.groupId
WHERE EXISTS (SELECT userId FROM users_groups WHERE groupId = l.groupId)

你这里有两个问题:

  • 您需要排除组 40
  • 中的所有用户已经
  • 如果用户在多个其他组中,您也不希望添加两次。

我们可以使用 EXCEPT 解决第一个问题,这将删除所有现有用户。

EXCEPT 也解决了第二个问题,因为它意味着 DISINCT

INSERT INTO user_groups(userId, groupId)
SELECT ug.userId, @groupId 
    FROM user_groups ug 
    INNER JOIN @list l ON ug.groupId = l.groupId
EXCEPT   -- EXCEPT implies DISTINCT
SELECT userId, groupId
    FROM users_groups;

旁白:您应该使用适当的 table 类型参数而不是字符串拆分:

CREATE TYPE GroupList AS TABLE (groupId int NOT NULL);
CREATE PROC yourProcedureHere
    @targetGroupId int,
    @groupList IntList
AS
.....