【问题标题】:Update a field in table A with the max value of field in table B用表 B 中字段的最大值更新表 A 中的字段
【发布时间】:2014-01-30 09:28:10
【问题描述】:

我想更新一个字段,我们称它为“field_A”,在表“table_A”中使用“table_B”中字段“field_B”的最大值,但只有当该字段有最大值时表 'table_B' 中的 field_B'。

表 'table_B' 有一个 'reference' 字段,其中包含我们要更新的 table_A 记录的 'id'。

现在我有以下查询,它运行良好。

UPDATE table_A a SET a.field_A = (SELECT MAX(b.field_B) 
    FROM table_B WHERE b.reference = a.id) 
WHERE a.id IN (
    SELECT reference
    FROM table_B
    GROUP BY reference
    HAVING COUNT(reference) > 0
)

因此,如果找到该引用的记录,它只会更新 field_A,因为我不想在未找到相关记录时将字段“field_A”设置为零。

正如我之前所说,此查询已经完美运行,但现在我必须对 table_B 运行两次查询,这似乎有点效率低下,可能只用 1 个连接语句就可以做到,但我可以'似乎无法解决这个问题。

由于此查询必须交叉引用很多非常多的记录,因此性能在这里确实是一个问题。

【问题讨论】:

  • 我试图将问题表述得尽可能笼统,我希望它很清楚:)。

标签: mysql sql join sql-update


【解决方案1】:

使用这两个嵌套语句,您的 UPDATE 语句看起来相当
对我来说效率低下。试试下面这个 SQL 语句,应该可以完成这项工作。

这里的 SQL 小提琴:http://sqlfiddle.com/#!2/5825a/2

UPDATE table_A a1

JOIN 

(

    SELECT a.id as id, max(b.field_B) as max_val
    FROM
    table_A a
    LEFT JOIN table_B b ON a.id = b.reference 
    GROUP BY a.id

) t on a1.id = t.id

SET

a1.field_A = t.max_val

WHERE

(t.max_val IS NOT NULL)

【讨论】:

  • JOIN 不会通过影响性能来增加查询执行时间吗?
  • @Akanksha 不,这比 OP 的尝试要好。无论如何,您至少需要一个 JOIN。
  • @Akanksha 我也不是 :)
  • @peter.petrov 谢谢彼得,这完全符合我的意思,正如我所料,它确实在性能方面有所不同。
猜你喜欢
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多