¿Función de agregado en una consulta de actualización SQL?
Estoy tratando de establecer el valor en una tabla a la suma de los valores en otra tabla. Algo en este sentido:
UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3
Por supuesto, tal como está esto, no funcionará - SET
no soporta SUM
y no soporta GROUP BY
.
Debería saber esto, pero mi mente está en blanco. ¿Qué estoy haciendo mal?
5 answers
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
from table2
group by field3) as t2
on t2.field3 = t1.field3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-06 01:06:55
Uso:
UPDATE table1
SET field1 = (SELECT SUM(t2.field2)
FROM TABLE2 t2
WHERE t2.field3 = field2)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-30 12:25:09
O podrías usar una mezcla de JBrooks y OMG Ponies respuestas:
UPDATE table1
SET field1 = (SELECT SUM(field2)
FROM table2 AS t2
WHERE t2.field3 = t1.field3)
FROM table1 AS t1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:26
Una buena situación para usar CROSS APPLY
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
CROSS APPLY (SELECT SUM(field2) as field2Sum
FROM table2 t2
WHERE t2.field3 = t1.field3) AS t2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-15 00:41:32
Sé que la pregunta está etiquetada con SQL Server, pero tenga cuidado con ACTUALIZAR con JOIN si está utilizando PostgreSQL. La respuesta de @JBrooks no funcionará:
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3
Tendrás que adaptarlo a:
UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3
Ver el parámetro from_list
es el doc para obtener por qué FROM
es considerado por PostgreSQL como un auto-join: https://www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 16:38:58