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 únicoLATERAL 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 doFROM
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. ) OLATERAL
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?