SQL INSERT INTO具有来自不同表的多个SELECTS

时间:2016-10-11 08:37:09

标签: sql sql-server cursor

我正在尝试插入包含2个表中数据的行。第一个表是我的用户AspNetUsers和第二个表AspNetUserRoles。我想给所有用户相同的角色。我尝试过以下方法:

  INSERT INTO [MyDB].[dbo].[AspNetUserRoles] ([UserId], [RoleId])
  SELECT (SELECT Id FROM [MyDB].[dbo].AspNetUsers) AS UserId,
 (SELECT Id FROM [MyDB].[dbo].[AspNetRoles] WHERE Name = 'Intermediary') AS RoleId

我收到错误:

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

这是因为查询正在选择我想要的所有用户,但我的SQL需要修改以插入每个用户和相同的RoleId。

我想我可能需要使用光标,或者我应该怎么做呢?我正在使用MS SQL Server。

2 个答案:

答案 0 :(得分:3)

这应该有效:

INSERT INTO [MyDB].[dbo].[AspNetUserRoles] 
    ([UserId], [RoleId])
SELECT 
    Id,
    (SELECT Id FROM [MyDB].[dbo].[AspNetRoles] WHERE Name = 'Intermediary') AS RoleId
FROM
    [MyDB].[dbo].AspNetUsers

只要WHERE Name = 'Intermediary'返回1行。

答案 1 :(得分:1)

这是另一种方式

INSERT INTO [MyDB].[dbo].[AspNetUserRoles]
            ([UserId],[RoleId])
SELECT ANU.Id AS [UserId],
       ANR.Id AS [RoleId]
FROM   [MyDB].[dbo].AspNetUsers ANU
       CROSS JOIN [MyDB].[dbo].[AspNetRoles] ANR
WHERE  ANR.NAME = 'Intermediary'