2012-05-11 67 views
4

我有3個表,我需要通過計算其他兩個表中的數據來更新第3個表的列。多個ID的更新聲明

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; 

此查詢工作正常,它更新第三表列,但是如果我供應商這樣的:

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行,我該如何處理這種情況?任何暗示/想法都會有所幫助。

如何更新多個ID?即。由ID 100返回的選擇查詢值應該更新爲ID 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

你也應該在你的UPDATE加入table3。試試這個:

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