从一个 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
.....
我在尝试使以下存储过程工作时遇到问题。我有一个 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
.....