我想更新一个字段,让我们称之为'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个连接语句就可以做到但我可以'似乎解决了这个问题。
由于这个查询必须交叉引用很多,实际上很多记录,因此性能确实是一个问题。
答案 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)