De acordo com o SQL padrão UNION
/ UNION ALL
não garante nenhuma ordem de classificação específica sem uma ORDER BY
cláusula externa - como quase não há lugar no SQL onde a ordem de classificação é garantida sem ORDER BY
.
No entanto, o Postgres usa uma etapa "Append" para casos simples de UNION ALL
, portanto, os resultados da primeira perna (mesmo que não classificados entre suas partições) sempre vêm antes da próxima perna, etc. O Postgres simplesmente anexa os resultados de cada perna na ordem dada. Isso é particularmente relevante com uma LIMIT
cláusula:
SELECT 1 FROM tbl -- or any complex query
UNION ALL
SELECT 2
LIMIT 1
Obviamente, isso não vale para UNION
(sem ALL
). Mas fora isso, nunca vi o Postgres retornar fora de ordem, ou seja, '2' da consulta acima, enquanto o primeiro SELECT
também retornaria linha(s). Nem mesmo se a primeira etapa for extremamente cara.
Eu baseei consultas sobre esse comportamento no passado. Agora , encontrei uma alegação de que o Postgres pode retornar linhas fora de ordem aqui, mas sem comprovação real.
O atual manual do Postgres tem a dizer sobre o assunto:
UNION
efetivamente acrescenta o resultado dequery2
ao resultado dequery1
(embora não haja garantia de que esta seja a ordem em que as linhas são realmente retornadas). Além disso, elimina linhas duplicadas de seu resultado, da mesma forma queDISTINCT
, a menos queUNION ALL
seja usado.
Isso é bastante obscuro. A ordem citada se aplica à lista de SELECT
cláusulas, ou linhas dentro de cada cláusula, ou apenas ao conjunto retornado? Além disso, UNION ALL
é mencionado apenas na segunda frase, então não está claro se a primeira frase tão importante deve se aplicar a UNION ALL
...
Alguém pode mostrar um exemplo, onde as linhas são retornadas fora de ordem, quebrando a sequência de UNION ALL
cláusulas? Em qualquer versão do Postgres. (Mesmo que a versão mais recente seja a mais interessante.)
Se não for isso, há motivos para acreditar que isso pode mudar em uma versão futura?
ORDER BY
não é a questão imediata aqui. A questão é se várias UNION ALL
cláusulas retornam linhas na sequência determinada (antes LIMIT
podem ser acionadas e impedir que outras ramificações sejam executadas).