sql >> Base de Datos >  >> RDS >> PostgreSQL

Declaración de actualización usando una cláusula WHERE que contiene columnas con valores nulos

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 :