【问题标题】:SQL Insert into table where subquery returns more than 1 valueSQL插入到子查询返回超过1个值的表中
【发布时间】:2014-10-06 08:58:17
【问题描述】:

我有一个使用子查询来确定某些值的查询。当第二个子查询中只有一个结果时,它运行良好,但是当第二个子查询中有多个可能的结果时,它会失败并显示

消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个 价值。当子查询跟在 =, !=, = 或当子查询被用作表达式错误时。

我想为第二个子查询标识的多个值中的每一个插入一条记录。

我的代码如下:

Declare @RoomID char (11)
Select @RoomID = min (RoomID) from tbRoom
While @RoomID is not null
begin
INSERT INTO [dbo].[tbSurveyLocation]
   ([SurveyUID]
   ,[LocationParentID]
   ,[LocationID]
   ,[Comment]
   ,[SurveyParentTypeID]
   ,[CanSurvey]
   ,[Surveyed]
   ,[Status]
   ,[LastUpdate]
   ,[LastUpdateUser]
   ,[ClientCode])

VALUES

((SELECT SurveyUID FROM tbSurvey where SurveyTitle = 'CARLISLE PARK CRICKET PAVILLION')

,30

,(SELECT tbRoom.RoomID FROM         tbBuilding INNER JOIN
              tbBuildingLinkBusinessUnit ON tbBuilding.BuildingID = tbBuildingLinkBusinessUnit.BuildingID INNER JOIN
              tbBusinessUnit ON tbBuildingLinkBusinessUnit.BusinessUnitID = tbBusinessUnit.BusinessUnitID INNER JOIN
              tbFloor ON tbBuilding.BuildingID = tbFloor.BuildingID INNER JOIN
              tbRoom ON tbFloor.FloorID = tbRoom.FloorID
               WHERE tbBusinessUnit.BusinessUnitName like '%CARLISLE PARK CRICKET PAVILLION%')

,'',203 ,1,1,0,CONVERT(DATETIME, '10/01/2014 00:00', 102),'PDS 2014','~K2~')
end

我在这里检查了其他类似的答案,但根据我的情况,找不到与各种子查询直接相关的任何内容。

【问题讨论】:

  • this: stackoverflow.com/questions/13830312/… 否则,为什么不先获取“子查询”,将其添加到列表中,然后执行第二个“主”查询?
  • 谢谢,但我试过了,显然一定是弄错了,因为我仍然遇到同样的错误。至于子查询/列表选项,我对此很陌生,不知道有多抱歉。感谢您抽出时间回复
  • 我已经修改了代码,以便获取每条记录(感谢您的指点)。我如何限制查询所花费的时间,因为它需要很长时间才能遍历 10000 条可能的记录?谢谢
  • 添加索引怎么样?

标签: sql sql-server-2008 sql-insert


【解决方案1】:

我应该提前说,我不知道您的问题的更大背景或您需要插入多少条记录。但是,仅根据您发布的代码,这看起来可能会更好地满足您的需求:

INSERT INTO [dbo].[tbSurveyLocation]
([SurveyUID]
,[LocationParentID]
,[LocationID]
,[Comment]
,[SurveyParentTypeID]
,[CanSurvey]
,[Surveyed]
,[Status]
,[LastUpdate]
,[LastUpdateUser]
,[ClientCode])

SELECT  -- I'm going to keep this subquery because it isn't clear whether tbSurvey 
        -- is related to the rooms and business units in any way.
       (SELECT   Top 1 -- this ensures you only get one record back
                 SurveyUID
        FROM     tbSurvey
        WHERE    SurveyTitle = 'CARLISLE PARK CRICKET PAVILLION'
        -- If it matters which row you get, you can sort the survey with an ORDER BY here.
        )
     , 30
     , tblRoom.RoomID
     , ''
     , 203
     , 1
     , 1
     , 0
     , CONVERT(DATETIME, '10/01/2014 00:00', 102)
     ,'PDS 2014'
     ,'~K2~'
FROM   tbBuilding 
    JOIN tbBuildingLinkBusinessUnit ON tbBuilding.BuildingID = tbBuildingLinkBusinessUnit.BuildingID 
    JOIN tbBusinessUnit ON tbBuildingLinkBusinessUnit.BusinessUnitID = tbBusinessUnit.BusinessUnitID 
    JOIN tbFloor ON tbBuilding.BuildingID = tbFloor.BuildingID 
    JOIN tbRoom ON tbFloor.FloorID = tbRoom.FloorID
 WHERE tbBusinessUnit.BusinessUnitName like '%CARLISLE PARK CRICKET PAVILLION%')

我刚刚所做的将为您提供与业务部门“CARLISLE PARK CRICKET PAVILLION”相关联的所有房间的记录。如果您只需要一个房间,您可以将目标列列表下方的SELECT 更改为SELECT TOP 1。 (这将为您提供一个符合标准的任意房间;如果您需要一个特定房间,例如 ID 最低的房间,请在末尾使用 ORDER BY 子句来控制哪个房间是“前 1”。)

现在,如果您需要执行类似链接调查标题和业务单位名称的操作,因此它们是相同的,并针对所有调查/业务单位运行此操作,而不仅仅是 Carlisle Park,请在 cmets 中告诉我.如果是这样,请告诉我您期望进行多少次具有相同调查标题的调查(一个?多于一个?),以及您期望给定业务单位的房间数量是否大于一个。

【讨论】:

  • 安L,你是明星。非常感谢您的帮助,它工作得很好。不敢相信它真的是多么简单,我是如何试图把它复杂化的:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2013-04-05
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多