SQL使用Select语句将多行插入表中

时间:2014-05-01 20:03:41

标签: sql sql-server-2012

我有三张牌桌:角色,权限,& RolePermissions(将两个表链接在一起。它有两列:RoleId和PermissionId)。

我在权限中添加了一个新行,因此我需要将其设置为任何具有权限= 117的角色也等于我刚刚创建的最新权限(可以是任何数字)。 例如,假设您具有权限117的顾问角色,那么您将自动拥有此新权限(即max(id))

这是我尝试过的代码:

INSERT INTO RolePermissions 
VALUES
(
    (SELECT RoleId FROM RolePermissions WHERE PermissionID = '117'), 
    (select max(id)     from Permissions)
);

它说:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我相信它是因为有多个角色= 117所以它需要制作多行。我是一个n00b并且不确定如何使它成为多行,我会使用循环吗?

谢谢

1 个答案:

答案 0 :(得分:3)

您的子查询中没有WHERE子句,因此每个权限返回每个max_ID

INSERT INTO RolePermissions VALUES (RoleID, PermissionID, newcolumn)
SELECT RoleID, PermissionID, (SELECT MAX(ID) from Permissions) from 
RolePermissions WHERE PermissionId = 117

要打破这一点:

您要将其添加到您的联接表中,包括您未提及名称的“新列”...

您将从原始表中选择RoleID和PermissionID,您的PermissionID = 117(如果这是INT字段,则不需要单引号)。如果要进一步隔离MAX(Id)将WHERE子句添加到子查询中,您将对Permissions表的MAX(ID)的最后一列进行子查询。

这会将具有权限ID = 117的所有用户添加到表中,他们应该已经拥有记录。所以你现在每人有两条记录,其中PermissionId 117,唯一的区别在于附加列,第一条记录将为null,第二条记录的值为MAX(Id)

如果您不想添加新成员,可能需要更新permissionId = 117的行 为此,你会:

UPDATE RolePermissions
SET newcolumn = (SELECT MAX(ID) from Permissions)
WHERE PermissionID = 117