Pergunta

Se eu tiver algumas declarações União como exemplo artificial:

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

O que é o comportamento order by padrão?

Os dados de teste que eu estou vendo essencialmente não retorna os dados na ordem em que é especificado acima. Ou seja, os dados são ordenados, mas eu queria saber quais são as regras de precedência sobre este assunto.

Outra coisa é que, neste caso, xxx é uma View. A visão se junta 3 tabelas diferentes juntos para retornar os resultados que eu quero.

Foi útil?

Solução

Não há uma ordem padrão.

Sem um Order By cláusula a ordem de retorno é indefinido. Isso significa que o SQL Server pode trazê-los de volta em qualquer ordem que ele gosta.

EDIT: Baseado no que tenho visto, sem ORDER BY, a fim de que os resultados voltar em depende do plano de consulta. Portanto, se há um índice que ele está usando, o resultado pode voltar nessa ordem, mas novamente não há nenhuma garantia.

Outras dicas

No que diz respeito à adição de uma cláusula ORDER BY:

Este é provavelmente fundamental para a maioria aqui, mas eu pensei que eu adicione. Às vezes você não quer que os resultados misturado, assim que você quer resultados do primeiro consulta, em seguida, o segundo e assim por diante. Para fazer isso eu só adicionar uma primeira coluna ea ordem manequim por isso. Devido a possíveis problemas com esquecendo-se aliás uma coluna em sindicatos, eu costumo usar ordinais na ordem pela cláusula, não os nomes das colunas.

Por exemplo:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

A coluna ordinal manequim também é útil para momentos em que eu estou indo para executar duas consultas e sei apenas um está indo para nenhum resultado. Então eu só posso verificar o ordinal dos resultados retornados. Isso me poupa de ter que fazer várias chamadas de banco de dados e mais verificação de resultados vazio.

Apenas encontrou a resposta real.

Porque UNIÃO remove duplicatas ele faz uma espécie distinta. Isso é feito antes de todas as declarações da União estão concatenadas (confira o plano de execução).

Para parar uma espécie, fazer um UNION ALL e isso também não irá remover duplicatas.

Se você se importa que ordem os registros são retornados, você deve usar uma ordem de.

Se você deixá-lo fora, pode aparecer organizadas (com base nos índices escolhidos pelo plano de consulta), mas os resultados que você vê hoje pode não ser os resultados esperados, e que poderia até mesmo mudança quando a mesma consulta é executado amanhã.

Edit: Algumas boas, exemplos específicos: (todos os exemplos são MS SQL Server)

  • blog de Dave Pinal descreve como duas consultas muito semelhantes pode mostrar uma ordem aparente diferente, porque diferentes índices são utilizados:

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • Conor Cunningham mostra como a ordem aparente pode mudar quando a tabela fica maior (se o otimizador de consulta decide usar um plano de execução paralela).

  • Hugo Kornelis prova que a ordem aparente é não sempre com base na chave primária. Aqui é o seu follow-up pós com a explicação.

A união pode ser enganosa em relação ao resultado de pedidos set porque um banco de dados, por vezes, usar um método de ordenação para fornecer o distinto que está implícita na União, o que faz parecer que as linhas são deliberadamente ordenados - isso não se aplica a UNION ALL para o qual não há nenhuma distinta implícita, é claro.

No entanto, existem algoritmos para a distinta implícita, como o método de hash da Oracle em 10g +, para que nenhuma ordenação vai ser aplicada.

Como DJ diz, sempre use um ORDER BY

É muito comum se deparar com código mal escrito que assume dados da tabela são retornados em ordem de inserção, e 95% do tempo o codificador fica afastado com ele e nunca está ciente de que este é um problema como em muitas bases de dados comuns (MSSQL , Oracle, MySQL). É claro que é uma falácia completa e deve sempre ser corrigido quando é se deparar, e sempre, sem exceção, use uma cláusula de ordem por si mesmo.

Da minha experiência prática você pode alterar a ordem usando "UNIÃO" contra "UNION ALL" ... i se sua consulta é como

Select Count(*) from Table A
UNION 
Select Count(*) from Table B

result is
10
26

você pode virar ordem, substituindo "união" com "UNION ALL" ... seguida resultado será

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