PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Atualização em massa no postgreSQL usando unnest


Você está chamando unnest 3 vezes em FROM cláusula, isso significa que você está fazendo um CROSS JOIN (produto cartesiano) do 3.

Se você estiver no PostgreSQL 9.4 ou superior, você pode simplesmente fazer uma chamada de unnest dando cada array 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)

Outra opção, para qualquer versão, é adicionar a chamada a unnest em SELECT em vez 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

Em ambos os casos, mas especialmente no último, você deve ter certeza de que cada array tem exatamente o mesmo número de elementos. Se isso não acontecer no primeiro método, cada linha ausente será preenchida como NULL, mas na segunda retornará tantas linhas quanto LCM do número de linhas retornadas por cada um, o que você provavelmente não deseja. Exemplo:
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)

Verifique a documentação sobre chamadas de funções de tabela Para maiores informações.