使用表B中字段的最大值更新表A中的字段

时间:2014-01-11 09:36:03

标签: mysql sql join sql-update

我想更新一个字段,让我们称之为'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个连接语句就可以做到但我可以'似乎解决了这个问题。

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

1 个答案:

答案 0 :(得分:2)

使用这两个嵌套语句,您的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)