我有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;
此查询工作正常,它更新了第三表列,但是,如果我提供这样的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?IE。由ID 100返回的选择查询值应针对第3个表中的ID 100和ID 101进行类似更新。
另外,我需要做一个像sum(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);
这是因为您试图将其设置column3为返回的结果,并且SQL期望该值只能是一个值(标量)。当您传递多个返回值时,SQL引擎会感到困惑(它应该使用哪一个返回值?…它不假定要遍历结果)。因此,如果要更新整个结果集,则需要从查询中创建一个子表并对其进行联接。您的查询应更像这样
column3
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 ...
where table2.id IN ...