2013-07-09 6 views
0

Привет от абсолютного новичка в SQL!Еще один вопрос в подзапросе

У меня есть поле, которое я хочу заполнить на основе другого стола. Для этого я написал этот запрос, который терпит неудачу: Msg 512, Level 16, State 1, Line 1 Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение. Заявление было прекращено.

Хорошо, здесь идет:

Update kre.CustomerOrderLineCopy 
SET DepNo = (SELECT customerordercopy.DepNo 
          FROM kre.CustomerOrderCopy , kre.CustomerOrderLineCopy 
          WHERE CustomerOrderLineCopy.OrderCopyNo =kre.CustomerOrderCopy.OrderCopyNo) 
WHERE CustomerOrderLineCopy.OrderCopyNo = (SELECT CustomerOrderCopy.OrderCopyNo 
          FROM kre.CustomerOrderCopy, kre.CustomerOrderLineCopy 
          WHERE kre.CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo) 

То, что я пытаюсь сделать, это изменить DepNo в CustomerOrderLineCopy, со значением в DepNo в CustomerOrderCopy - на основе той же OrderCopyNo в обеих таблицах.

Я открыт для всех предложений.

Спасибо, ohalvors

ответ

0

Если вы просто соединить таблицы вместе обновление проще:

UPDATE A SET A.DepNo = B.DepNo 
FROM kre.CustomerOrderLineCopy A 
INNER JOIN kre.CustomerOrderCopy B ON A.OrderCopyNo = B.OrderCopyNo 
+0

Спасибо! Я использовал ваше предложение и получил то, что хотел. – ohalvors

0

Проблема в том, что по крайней мере один из ваших вложенных запросов возвращать более одного значения. Подумайте об этом:

tablePerson (имя, возраст)

Адам, 11

Eva, 11

Sven 22

update tablePerson 
    set name = (select name from tablePerson where age = 11) 
    where name = 'Sven' 

Что эквивалентно: установить имя Свена в Адам и Ева. Это невозможно.

Если вы хотите использовать подзапросы, либо убедитесь, что к югу запросы могут возвращать только одно значение или силу одно значение с помощью:

select top 1 xxx from ... 
0

Это может быть достаточно, чтобы успокоить его вниз:

Update kre.CustomerOrderLineCopy 
SET DepNo = (SELECT customerordercopy.DepNo 
          FROM kre.CustomerOrderCopy --, kre.CustomerOrderLineCopy 
          WHERE CustomerOrderLineCopy.OrderCopyNo =kre.CustomerOrderCopy.OrderCopyNo) 
WHERE CustomerOrderLineCopy.OrderCopyNo = (SELECT CustomerOrderCopy.OrderCopyNo 
          FROM kre.CustomerOrderCopy --, kre.CustomerOrderLineCopy 
          WHERE kre.CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo) 

(Где я закомментирована kre.CustomerOrderLineCopy в подзапросах) То есть, вы были с надеждой пытаются соотнести эти подзапросы с внешней таблицей - не вводить еще один экземпляр kre.CustomerOrderLineCopy.

Если вы все еще получаете сообщение об ошибке, то у вас все еще есть несколько строк в kre.CustomerOrderCopy, у которых одинаковые OrderCopyNo. Если это так, вам нужно предоставить нам (и SQL Server) правила, которые вы хотите применить, для того, чтобы выбрать, какую строку вы хотите использовать.

Опасность перехода на форму FROM ... JOIN, показанную в ответе @ Авитуса, заключается в том, что он больше не будет сообщать, есть ли несколько совпадающих строк - он просто будет выбирать один из них - это никогда не становится ясным.


Теперь я снова смотрю на запрос, я не уверен, что даже нуждается пункт WHERE в настоящее время.Я думаю, это будет одинаково:

Update kre.CustomerOrderLineCopy 
SET DepNo = (
    SELECT customerordercopy.DepNo 
    FROM kre.CustomerOrderCopy 
    WHERE CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo) 
+0

Спасибо за это, хотя он дал ту же ошибку. Я уже пробовал это предлагаемым способом. Я закончил использовать ответ Авитуса, и он дал мне то, что мне было нужно, - пока не вижу никаких ошибок. – ohalvors

+0

@ohalvors - как я указывал в своем четвертом абзаце, проблема в том, что проблема с тем же * все еще происходит, но теперь SQL Server не беспокоится о том, что вы указываете несколько значений соответствия для определенного 'OrderCopyNo', один из них будет использоваться, но вы не знаете, какой из них. Это, например, означает, что если вы дважды запустите запрос, теоретически результаты могут быть разными. –

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