我正在编写查询以更新表(TableA)使用另一个表(TableB)中的值,表B针对TableA中的每一行返回多个值,并且请求将使用最大值进行更新返回TableB中的值。
我可以通过以下方式实现这一目标:
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 ...)
我认为第二个可能会有更好的表现,但我找不到最大的价值,因为它不支持“order by"
。
将表B加入两次并比较B的值可以解决问题,但是执行可能比第一次查询更差。
有什么想法吗?
**实际情况比例子复杂,例如tableA和tableB需要加入“......或......或......或......”,费用会更高。
答案 0 :(得分:1)
对获得INNER JOIN
最大值的子查询使用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
答案 1 :(得分:1)
您提供的示例使用相关的suqueries,因此对于A中的每一行,将执行子查询。您可以在查询中使用TableA两次避免相关子查询,例如
UPDATE TableA
SELECT TableA.Col1 = t2.Col1, TableA.Col2 = TableB.Col
FROM TableA t2
INNER JOIN TableB ON ...