Eu tenho uma visão que une várias tabelas, apenas para simplificar uma consulta frequentemente chamada. Esta exibição possui uma cláusula ORDER BY em um campo calculado (a ordem nunca será diferente). (no SQL Server Express 2008 R2).
A ideia básica é assim (simplificada):
SELECT [EventType].Name,
[EventType].TotalOccurrences,
[Session].ID,
[Session].TotalOccurrences,
[Session].TotalOccurrences / [EventType].TotalOccurrences AS saturation
FROM [EventType]
INNER JOIN [Session] ON [EventType].ID = [Session].Event
ORDER BY saturation
Essa visão nunca será chamada sem uma cláusula where (que no meu caso quase retornaria o banco de dados inteiro). Estará sempre com WHERE [EventType].ID = x
. No entanto, assim que adiciono a cláusula where, a cláusula ORDER BY é ignorada! Sem a cláusula where, está funcionando conforme o esperado.
Na verdade, uma pergunta diferente, mas estou jogando aqui enquanto estou nisso, existe uma maneira melhor de recuperar essas informações? O [EventType].Name
e [EventType].TotalOccurrences
será idêntico para todas as linhas retornadas, o que é um pequeno desperdício de largura de banda da rede. Não que isso seja um problema, mas estou me perguntando se existe algo para resolver isso sem a sobrecarga de latência de várias viagens de ida e volta ao banco de dados.
[Editar] A amostra acima foi simplificada demais, o campo calculado tem outros fatores para que ele retorne uma ordem diferente do ORDER BY [Session].TotalOccurrences
que seria simplesmente neste exemplo, mas o princípio deve ser claro.
[Edit2] Da resposta chego à conclusão de que o Designer Gráfico tem mais recursos do que o banco de dados subjacente:
A consulta que você postou não é válida para criar uma visão; a execução
CREATE VIEW xy AS
dessa consulta resultará em um erro. Você está usando umaTOP
cláusula?Uma visão, sendo uma expressão de tabela (um conjunto), não pode ter a ordem definida, pois isso iria contra os princípios de um modelo relacional (não há ordem para linhas em uma tabela relacional - um conjunto é uma coleção não ordenada de tuplas). O mesmo vale para outras expressões de tabela - tabelas derivadas, CTEs etc.
Do artigo da BOL sobre a
ORDER BY
cláusula:Resumindo: use a
ORDER BY
cláusula na consulta externa que faz referência à exibição. Não o use em uma exibição. Mesmo usá-lo comTOP(100) PERCENT
(ou no SQL Server 2012, oOFFSET-FETCH
equivalente) não garante a ordem de apresentação, significa apenas que você obterá os 100% principais das linhas, em qualquer ordem.