2014-10-06 2 views
-1

У меня есть запрос, который использует подзапросы для определения определенных значений. Когда во втором подзапросе есть только один результат, он работает нормально, но при наличии более одного возможного результата во втором подзапросе это сбой происходит сSQL Вставить в таблицу, где подзапрос возвращает более одного значения

Msg 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 

Я проверил другие подобные ответы на здесь, но не могу найти ничего, что непосредственно связано с различными подзапросов как в моей ситуации.

+1

это: http://stackoverflow.com/questions/13830312/insert-multiple-rows-using-subquery иначе, почему бы вам не получить «подзапрос» сначала, добавить это в список, а затем сделать свой второй «основной» запрос? – jbutler483

+0

Спасибо, но я пробовал это и, очевидно, должен был ошибиться, поскольку я все еще получал ту же ошибку. Что касается опции sub-query/list, я очень к этому знаком и не знаю, как извините. Цените, что вы нашли время ответить, хотя –

+1

читайте по этому поводу: http://support2.microsoft.com/kb/111401/nl – jbutler483

ответ

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%') 

То, что я только что сделал даст вам записи для всех номеров, которые были связаны с бизнес-единицы «КАРЛАЙЛ PARK CrickeT PAVILLION». Если вам нужна только одна комната, вы можете изменить SELECT прямо под заголовком целевого столбца до SELECT TOP 1. (Это даст вам произвольную комнату, которая соответствует критериям, если вам нужна определенная комната, например, с наименьшим идентификатором, используйте предложение ORDER BY в конце, чтобы определить, какая комната является «верхней 1».)

Теперь, если вам нужно сделать что-то вроде ссылки на название опроса и название бизнес-единицы, значит, они одинаковы, и запустите это для всех опросов/бизнес-единиц, а не только Carlisle Park, сообщите мне в комментариях. Если да, сообщите мне, сколько опросов вы ожидаете с тем же заголовком опроса (один? Более одного?), И количество номеров, которые вы ожидаете от данного бизнес-единицы, больше одного.

+0

Энн Л, ты звезда. Большое спасибо за помощь, он отлично работает. Не могу поверить, насколько просто это было на самом деле и как я пытался его скомпрометировать :-) –

+0

@MGSQLMuppet Добро пожаловать! Рад, что смог помочь! –

Смежные вопросы