Como posso encomendar entradas em uma união sem ORDER BY?
-
03-07-2019 - |
Pergunta
Como posso ter certeza de que o meu conjunto de resultados terá a
primeiro e segundo b
? Isso me ajudaria a resolver um problema de ordenação complicado.
Aqui está um exemplo simplificado do que estou fazendo:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
Solução
SELECT col
FROM
(
SELECT a col, 0 ordinal FROM A LIMIT 1
UNION ALL
SELECT b, 1 FROM B LIMIT 1
) t
ORDER BY ordinal
Outras dicas
Eu não acho que a ordem é garantida, pelo menos não em todos os DBMS.
O que eu fiz no passado para controlar a ordem em sindicatos é:
(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
O seu conjunto de resultados com UNION
irá eliminar valores distintos.
Eu não consigo encontrar nenhuma prova na documentação, mas de 10
anos experiência, posso dizer que UNION ALL
não preservar a ordem, pelo menos em Oracle
.
Não confie sobre isso, no entanto, se você está construindo uma usina nuclear ou algo parecido.
Não, a ordem dos resultados em uma consulta SQL é controlado única pela cláusula ORDER BY. Pode ser que você acontecer para ver os resultados ordenados sem uma cláusula ORDER BY em alguma situação, mas isso é por acaso (por exemplo, um efeito colateral do plano consulta atual do otimizador) e não garantido.
O que é o problema de ordenação complicado?
Eu sei para Oracle não há nenhuma maneira de garantir que sairá primeiro sem uma ordem por. O problema é se você tentar isso pode sair na ordem correta até mesmo para a maioria das vezes você executá-lo. Mas assim que você confiar nele na produção, ele vai sair errado.
Eu teria pensado que não, já que o banco de dados seria mais provável necessidade de fazer um ORDER BY em ordem à União.
UNION ALL pode se comportar de forma diferente, mas YMMV.
A resposta curta é sim, você vai ter um, em seguida, B.