fim SQL por e junção externa esquerda não tem ordem correta
-
19-08-2019 - |
Pergunta
Eu tenho uma visão que está se juntando duas mesas e ordenação pela primeira tabela. Só que a ordem não está correto. Ele sente falta de um registro ocasional, e depois no final, a maioria desses registros existem em ordem, e depois para o efeito, o resto dos registros existem em ordem. Por isso, tem registros como
1 (most of the records in order)
2
4
5
6
7
8
10
11
13
15
3 (the first set of missing records)
12
9 (the rest of the missing records)
14
A minha opinião é abaixo. Preciso fazer a ordem de antes de eu fazer a junção? O que estou fazendo de errado? (Eu adquiri este ponto de vista, e exatamente o mesmo ponto de vista em outra instância db funciona corretamente.)
CREATE VIEW [dbo].[SampleView]
AS
SELECT TOP 100 PERCENT blp.*, ISNULL(YEAR(DATEADD(month, 2, tb.[End of D&D])), 0) AS DEMO_FY
FROM dbo.Table1 AS blp LEFT OUTER JOIN
dbo.Table2 AS tb ON blp.FACIL_NAME = tb.[Structure ID]
ORDER BY blp.ID
(edit) O tipo para o campo de classificação é [ID] [int] NOT NULL IDENTIDADE (1, 1),
Solução
Leia Criar uma visão ordenada no SQL Server 2005 e SQL Server 2008 há um hotfix e você tem que executar em modo de compatibilidade 2000, para que ele funcione. Porque não basta fazer a encomenda por ao selecionar a partir do ponto de vista?
Outras dicas
Gostaria de remover a cláusula ORDER BY do ponto de vista completamente. Em vez disso, especifique a sua encomenda no momento que você consultar a exibição.
Um comentário em este entrada do blog torna bastante claro.
Apenas uma vez o texto de BOL:
"Quando ORDER BY é usada na definição de uma visão, função inline, tabela derivada, ou subconsulta, a cláusula é utilizada apenas para determinar as linhas retornadas pela cláusula TOP. A cláusula ORDER BY não garante resultados ordenados quando essas construções são consultados, a menos que ORDER BY também é especificado na própria consulta. "
"Embora a definição de exibição contém uma cláusula ORDER BY, que ORDER BY cláusula é usada apenas para determinar as linhas retornadas pela cláusula TOP. Ao consultar a vista em si, o SQL Server não garante os resultados serão ordenados, a menos que você especificar de forma tão explícita, como mostrado na consulta a seguir:
SELECT * FROM TopView
ORDER BY LastName
"
Provavelmente os dois servidores SQL são ligeiramente diferentes versões. Há um hotfix conhecida para esta:
Você deve sempre "ordem" no último ponto possível, uma vez que a classificação é lento (N log N). Quando você executa um seleto em uma visão, normalmente você vai incluir um onde cláusula. Você só quer ordenar que conjunto de resultados.