SQL更新多个值
我正在编写一个查询来更新一个表(TableA),使用另一个表(TableB)中的值,表B针对表a中的每一行返回多个值,请求使用表B中的最大的返回值进行更新 我可以通过以下方式实现这一目标: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) 我不确定这是达
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较重时,这有更好的效果。