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;
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top