Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL更新多个值_Sql_Sql Server - Fatal编程技术网

SQL更新多个值

SQL更新多个值,sql,sql-server,Sql,Sql Server,我正在编写一个查询来更新一个表(TableA),使用另一个表(TableB)中的值,表B针对表a中的每一行返回多个值,请求使用表B中的最大的返回值进行更新 我可以通过以下方式实现这一目标: UPDATE TableA SET Value = (SELECT TOP 1 B.Value FROM dbo.TableB B WHERE TableA.Key = B.Key ORDER BY B.Value desc) 我不确定这是达

我正在编写一个查询来更新一个表(TableA),使用另一个表(TableB)中的值,表B针对表a中的每一行返回多个值,请求使用表B中的最大的返回值进行更新

我可以通过以下方式实现这一目标:

UPDATE TableA 
SET Value = (SELECT TOP 1 B.Value FROM dbo.TableB B
                WHERE TableA.Key = B.Key
                ORDER BY B.Value desc)
我不确定这是达到要求的最佳方式,而且我担心上述查询的性能。它是否在表B上扫描多次以查找表A每行的值

我尝试了一些查询,例如使用

update tableA
set Value = TableB.Value
from (Table A left join Table B ... where ...)
我认为第二个可能有更好的性能,但我无法检索最大值,因为它不支持“
orderby”

连接表B两次并比较B的值可能会解决问题,但执行可能比第一次查询更糟糕

有什么想法吗


**实际情况比示例复杂,例如,tableA和tableB需要在“…或…或…或…”上进行连接,这将花费更多。

使用
内部连接
再次调用一个子查询,该子查询获取
tableB
的最大值

UPDATE  a
SET     a.Value = b.max_val
FROM    tableA a
        INNER JOIN 
        (
            SELECT  key, MAX(VALUE) max_val
            FROM    tableb
            GROUP   BY  key
        ) b ON a.key = b.key

您给出的示例使用了相关的suquery,因此,对于查询中的每一行,都将执行子查询。通过在查询中两次使用TableA,可以避免相关子查询,如

UPDATE TableA 
SELECT TableA.Col1 = t2.Col1, TableA.Col2 = TableB.Col
FROM TableA t2
INNER JOIN TableB ON ...

如果将表名(如
TableA)别名为t2
,则应在更新中使用别名,
updatet2
“因此,对于表中的每一行,将执行子查询。”这就是我接受你的答案的原因。我在“选择”查询中使用了“Row\u Number Order By”。当a连接B较重时,这有更好的效果。