Dado que null = null
se evalúa como false
debe verificar si dos campos son ambos null
además de verificación de igualdad:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
(table_one.invoice_number = table_two.invoice_number
OR (table_one.invoice_number is null AND table_two.invoice_number is null))
AND
(table_one.submitted_by = table_two.submitted_by
OR (table_one.submitted_by is null AND table_two.submitted_by is null))
AND
-- etc
También puede usar el coalesce
función que es más legible:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
coalesce(table_one.invoice_number, '') = coalesce(table_two.invoice_number, '')
AND coalesce(table_one.submitted_by, '') = coalesce(table_two.submitted_by, '')
AND -- etc
Pero debe tener cuidado con los valores predeterminados (último argumento para coalesce
).
Su tipo de datos debe coincidir con el tipo de columna (para que no termine comparando fechas con números, por ejemplo) y el valor predeterminado debe ser tal que no aparezca en los datos
E.g. coalesce(null, 1) = coalesce(1, 1)
es una situación que querrías evitar.
Actualización (sobre el rendimiento):
Seq Scan on table_two
- esto sugiere que no tiene ningún índice en table_two
.
Entonces, si actualiza una fila en table_one
luego para encontrar una fila coincidente en table_two
la base de datos básicamente tiene que escanear todas las filas una por una hasta que encuentra una coincidencia.
Las filas coincidentes se podrían encontrar mucho más rápido si las columnas relevantes estuvieran indexadas.
Por otro lado, si table_one
tiene algún índice que ralentiza la actualización.
Según esta guía de rendimiento
:
Otra sugerencia de la misma guía que podría ser útil es:
Entonces, por ejemplo, si table_one
un id
columna podría agregar algo como
and table_one.id between x and y
al where
condición y ejecute la consulta varias veces cambiando los valores de x
y y
para que todas las filas estén cubiertas.
Es posible que desee tener cuidado al usar ANALYZE
opción con EXPLAIN
cuando se trata de declaraciones con efectos secundarios. De acuerdo con la documentación
: