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

Qual é o comportamento esperado para várias funções de retorno de conjunto na cláusula SELECT?

Postgres 10 ou mais recente


adiciona valores nulos para conjuntos menores. Demonstração com generate_series() :
SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
null |   13 |   23
null | null |   24

dbfiddle aqui

O manual do Postgres 10 :

Se houver mais de uma função de retorno de conjunto na lista de seleção da consulta, o comportamento é semelhante ao que você obtém ao colocar as funções em um único LATERAL ROWS FROM( ... ) FROM -artigo de cláusula. Para cada linha da consulta subjacente, há uma linha de saída usando o primeiro resultado de cada função, depois uma linha de saída usando o segundo resultado e assim por diante. Se algumas das funções de retorno de conjunto produzirem menos saídas do que outras, os valores nulos serão substituídos pelos dados ausentes, de modo que o número total de linhas emitidas para uma linha subjacente seja o mesmo da função de retorno de conjunto que produziu a maioria das saídas. Assim, as funções de retorno de conjunto são executadas “em sincronia” até que todas estejam esgotadas e, em seguida, a execução continua com a próxima linha subjacente.

Isso acaba com o comportamento tradicionalmente estranho.

Postgres 9.6 ou anterior


O número de linhas de resultado (surpreendentemente!) é o mínimo múltiplo comum de todos os conjuntos no mesmo SELECT Lista. (Age apenas como um CROSS JOIN se não houver divisor comum para todos os tamanhos de conjuntos!) Demo:
SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
   1 |   13 |   23
   2 |   11 |   24
   1 |   12 |   21
   2 |   13 |   22
   1 |   11 |   23
   2 |   12 |   24
   1 |   13 |   21
   2 |   11 |   22
   1 |   12 |   23
   2 |   13 |   24

dbfiddle aqui

Documentado no manual do Postgres 9.6 o capítulo Funções SQL que retornam conjuntos , juntamente com a recomendação para evitá-lo:

Nota:O principal problema com o uso de funções de retorno de conjunto na lista de seleção, em vez do FROM cláusula, é que colocar mais de uma função de retorno de um conjunto na mesma lista de seleção não se comporta de forma muito sensata. (O que você realmente obtém se fizer isso é um número de linhas de saída igual ao mínimo múltiplo comum dos números de linhas produzidos por cada função de retorno de conjunto. ) O LATERAL A sintaxe produz resultados menos surpreendentes ao chamar várias funções de retorno de conjunto e geralmente deve ser usada.

Minha ênfase em negrito.

Uma única função de retorno de conjunto está OK (mas ainda mais limpa no FROM list), mas vários no mesmo SELECT lista é desencorajada agora. Este era um recurso útil antes de termos LATERAL junta. Agora é apenas lastro histórico.

Relacionado:
  • Unnest() paralelo e ordem de classificação no PostgreSQL
  • Desaninhar vários arrays em paralelo
  • Qual ​​é a diferença entre LATERAL JOIN e uma subconsulta no PostgreSQL?