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

Actualización masiva en postgreSQL usando unnest

Estás llamando a unnest 3 veces en FROM cláusula, eso significa que está haciendo un CROSS JOIN (producto cartesiano) de los 3.

Si está en PostgreSQL 9.4 o superior, puede simplemente hacer una llamada de unnest dando cada matriz como entrada:

select * from 
         unnest(
            array['2001622', '2001624', '2007903'],
             array[15,14,8],
             array['type1', 'type1', 'type1'],
             array[false, true, true]
        ) as u(id, ver, type, enabled)

Otra opción, para cualquier versión, es agregar la llamada a unnest en SELECT en lugar de FROM :

select
   unnest(array['2001622', '2001624', '2007903']) as id,
   unnest(array[15,14,8]) as ver,
   unnest(array['type1', 'type1', 'type1']) as type,
   unnest(array[false, true, true]) as enabled

En ambos casos, pero especialmente en el último, debes asegurarte de que cada matriz tenga exactamente el mismo número de elementos. Si no lo hace en el primer método, cada fila faltante se completará como NULL, pero en el segundo devolverá tantas filas como LCM del número de filas devueltas por cada uno, lo que probablemente no desee. Ejemplo:

SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
 [null] | e
 [null] | f
(6 rows)

SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
      1 | e
      2 | f
      3 | a
      4 | b
      1 | c
      2 | d
      3 | e
      4 | f
(12 rows)

Consulte la documentación en llamadas a funciones de tabla para más información.