2012-05-11 6 views
4

У меня есть 3 таблицы, мне нужно обновить столбец третьей таблицы, вычислив данные из двух других таблиц.Оператор обновления для нескольких идентификаторов

update table3 set column3= 
(
select t2.column3+t1.column3 
from table2 t2 with (nolock) join table1 t1 
on table2.id=t1.id 
where table2.id= 100 
) 
where id= 100; 

Этот запрос отлично работает, он обновляет 3-й столбец таблицы, однако, если я поставить IN операторов, как это:

update table3 set column3= 
    (
    select t2.column3+t1.column3 
    from table2 t2 with (nolock) join table1 t1 
    on table2.id=t1.id 
    where table2.id IN (100,101) 
    ) 
    where id IN (100,101); 

это не удается, и я получаю это сообщение

подзапрос возвращает более 1. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение. Заявление было прекращено.

& Я знаю, что это потому, что в подзапросе возвращается более 1 строки, как я могу справиться с этим сценарием? Любой намек/мысль будет полезной.

Как обновить несколько идентификаторов? то есть. значение запроса выбора, возвращаемое идентификатором 100, должно быть обновлено в соответствии с идентификатором 100 в третьей таблице & аналогично для ID 101.

Кроме того, мне нужно сделать сумму, подобную этой сумме (t2.column3) - (t1.column3 + t1 .column2)

update table3 set column3= 
     (
     select sum(t2.column3)- (t1.column3 + t1.column2) 
     from table2 t2 with (nolock) join table1 t1 
     on table2.id=t1.id 
     where table2.id IN (100,101) 
     ) 
     where id IN (100,101); 
+0

Вы правы, мне не нужны условия внутренней идентификации. – Sharpeye500

ответ

6

Это потому, что вы пытаетесь установить column3 к возвращенного результата и SQL ожидает, что будет только одно значение (скаляр). Механизм SQL запутывается, когда вы передаете ему более одного возвращаемого значения (которое он должен использовать? ... он не предполагает повторение результатов). Итак, если вы хотите обновить весь набор результатов, вам нужно создать подтаблицу из вашего запроса и присоединиться к ней. Ваш запрос должен выглядеть как этот

UPDATE Table3 
SET Column3 = subtable.value 
FROM Table3 
    JOIN (
     select t2.column3+t1.column3 as value, t1.id 
     from table2 t2 with (nolock) join table1 t1 
     on table2.id=t1.id 
     where table2.id IN (100,101) 
    ) AS subtable 
    ON subtable.id = Table3.id 
WHERE table3.id IN (100, 101) 

В этом предположении, что table3.id соответствует другим идентификаторам, вы действительно не нужны внутреннее where table2.id IN ...

1

Вы также должны присоединиться к table3 в вашем UPDATE. Попробуйте следующее:

UPDATE t3 
SET column3 = t2.column3+t1.column3 
FROM table3 t3 
INNER JOIN table2 t2 WITH(NOLOCK) 
ON t3.id = t2.id 
INNER JOIN table1 t1 
ON t3.id=t1.id 
WHERE t3.id IN (100,101) 
+0

Это очень близко, я попробовал это, как-то я понял. Мне нужно сделать такую ​​сумму sum (t2.column3) - (t1.column3 + t1.column2) – Sharpeye500

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