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
: