【问题标题】:SQL update more than one valueSQL 更新多个值
【发布时间】:2013-01-23 19:51:45
【问题描述】:

我正在编写一个查询来更新一个表 (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...”,会花费更多。

【问题讨论】:

  • 我在“Select”查询中使用了“Row_Number Order By”。当 A 连接 B 很重时,这会更好。

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

  • 如果为表名设置别名,如TableA AS t2,则应在更新中使用别名UPDATE t2
  • '所以对于 A 中的每一行子查询都会被执行。 ' 这就是我接受你的答案的原因。
【解决方案2】:

使用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-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多