0

我正在编写一个查询来更新表(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 需要加入“....or....or...or...”,成本会更高。

4

2 回答 2

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
于 2013-01-23T11:50:19.070 回答
1

您提供的示例使用相关的查询,因此对于 A 中的每一行,将执行子查询。您可以通过在查询中使用 TableA 两次来避免相关子查询,例如

UPDATE TableA 
SELECT TableA.Col1 = t2.Col1, TableA.Col2 = TableB.Col
FROM TableA t2
INNER JOIN TableB ON ...
于 2013-01-23T11:51:45.820 回答