我有3个表,我需要通过计算其他两个表中的数据来更新第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行,我该如何处理这种情况?任何提示/想法都会有所帮助。
如何更新多个ID?即。 ID 100返回的选择查询值应根据第3表中的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 :(得分: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匹配其他id,你也真的不需要内部where table2.id IN ...
答案 1 :(得分: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)