none
[View SQL] Por que a minha View não fica ordenada mesmo tendo o Order By? RRS feed

  • Pergunta

  • Olá,

    Trabalho aqui com o SQL Server 2008.

    Criei uma View com base em uma única tabela minha aqui.

    Segue parte do script utilizado:

    SELECT    CampoA, CampoB + CampoC as MeuCampo,
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY MeuCampo

    Como vimos a view é ordenada em forma crescente por uma coluna "dinâmica".

    Quando executo ou consulto a minha view a mesma não ordena nada.

    O que pode ser?

    Até mesmo no sql ela não ordena.

    Obrigado


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    • Editado TI DEV quarta-feira, 30 de julho de 2014 20:49
    segunda-feira, 17 de março de 2014 13:55

Respostas

  • Ah, e lembrei de um post do Gustavo sobre order by em views:

    http://gustavomaiaaguiar.wordpress.com/2009/01/23/piores-praticas-utilizar-a-clausula-order-by-em-views/

    Recomendo a leitura.

    []´s 

    • Marcado como Resposta TI DEV terça-feira, 18 de março de 2014 14:51
    segunda-feira, 17 de março de 2014 17:22
  • Olá,

    Na verdade trabalho com Sharepoint.

    No sharepoint temos um recurso (BCS) que permite a conexão com a base SQL.

    Estou utilizando o sharepoint para acessar a view.

    Entretanto,

    Eu criei um script com order by e tudo para montar a view.

    Quando executo este script a ordenação funciona bem, mas depois que eu "transformo" este script em View, o mesmo perde a ordenação quando executo a view ainda no SQL.

    Acho que o problema está no sql e não na consulta externa da view.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    k2rto'4,

    Agora ficou mais claro, na verdade utilizar o ORDER BY dentro de uma VIEW não é uma boa prática porque a view sempre irá ordenar seus dados como indicado em seu script, se você adicionar outra cláusula ORDER BY fora da VIEW sua consulta irá efetuar uma ordenação de dados mais de uma vez e dependendo do caso em sentidos opostos, gerando lentidão.

    De qualquer forma, dentro de uma VIEW você pode adicionar à instrução TOP 100 PERCENT para que retorne todos os dados da consulta, porém isto possibilita adicionar a ordenação dentro da VIEW.

    Veja um exemplo desta execução neste post do Blog MSDN:

    http://blogs.msdn.com/b/fcatae/archive/2010/04/17/desafio-usando-order-by-dentro-de-uma-view.aspx

    Não esqueça de marcar como resposta todos os posts que ajudaram na solução !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta TI DEV terça-feira, 18 de março de 2014 14:52
    segunda-feira, 17 de março de 2014 17:40
    Moderador

Todas as Respostas

  • K2rto'4,

    Você já tentou ordenar com os campos separados ? Veja abaixo:

    SELECT    CampoA, CampoB + CampoC as MeuCampo,
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY CampoB, CampoC

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Sugerido como Resposta Giovani Cr segunda-feira, 17 de março de 2014 15:11
    segunda-feira, 17 de março de 2014 14:07
    Moderador
  • Olá,

    Fiz aqui a alteração, mas não ordenou não.

    :\

    Continuarei com os testes.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    segunda-feira, 17 de março de 2014 16:44
  • O engraçado é que o meu select para a view, quando executado, exibe os dados certinhos e ordenados.

    Mas, sei lá, depois que coloco isto na view o mesmo não ordena mais.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    segunda-feira, 17 de março de 2014 16:50
  • Olá,

    Fiz aqui a alteração, mas não ordenou não.

    :\

    Continuarei com os testes.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    K2rto'4,

    Para realizar uma verificação mais próxima desta ordenação, criei uma tabela de exemplo. Veja abaixo:

    CREATE TABLE TB_ORDENA (
    CAMPO_A	VARCHAR(20) NOT NULL,
    CAMPO_B	VARCHAR(20) NOT NULL,
    CAMPO_C	VARCHAR(20) NOT NULL
    )
    GO
    
    TRUNCATE TABLE TB_ORDENA
    
    INSERT INTO TB_ORDENA VALUES ('N', '10', 'VALOR_C 1')
    INSERT INTO TB_ORDENA VALUES ('S', '9', 'VALOR_C 2')
    INSERT INTO TB_ORDENA VALUES ('N', '8', 'VALOR_C 3')
    INSERT INTO TB_ORDENA VALUES ('S', '7', 'VALOR_C 4')
    INSERT INTO TB_ORDENA VALUES ('N', '6', 'VALOR_C 5')
    INSERT INTO TB_ORDENA VALUES ('S', '5', 'VALOR_C 6')
    INSERT INTO TB_ORDENA VALUES ('N', '4', 'VALOR_C 7')
    INSERT INTO TB_ORDENA VALUES ('S', '3', 'VALOR_C 8')
    INSERT INTO TB_ORDENA VALUES ('N', '2', 'VALOR_C 9')
    INSERT INTO TB_ORDENA VALUES ('S', '1', 'VALOR_C 10')
    GO
    
    --ORDENA COMO TEXTO
    SELECT CAMPO_A, CAMPO_B + CAMPO_C AS MEUCAMPO
    FROM dbo.TB_ORDENA
    WHERE (CAMPO_A <> 'S') AND (CAMPO_A <> 'W')
    ORDER BY CAMPO_B, CAMPO_C
    GO
    
    --ORDENA COMO NUMERO
    SELECT CAMPO_A, CAMPO_B + CAMPO_C AS MEUCAMPO
    FROM dbo.TB_ORDENA
    WHERE (CAMPO_A <> 'S') AND (CAMPO_A <> 'W')
    ORDER BY CAST(CAMPO_B AS tinyint), CAMPO_C
    GO

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 17 de março de 2014 17:05
    Moderador
  • Boa tarde,

    K2rto'4, como você está usando essa view? Algum Join ou Order By externo?


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 17 de março de 2014 17:16
  • Pergunta: como que voce criou esta view com order by?
    Pelo que eu me lembre, não é possivel colocar order by dentro da view:
    "The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified."

    E neste caso, o order by tem que ser executado fora da view e nao dentro dela.

    []´s 

    segunda-feira, 17 de março de 2014 17:21
  • Ah, e lembrei de um post do Gustavo sobre order by em views:

    http://gustavomaiaaguiar.wordpress.com/2009/01/23/piores-praticas-utilizar-a-clausula-order-by-em-views/

    Recomendo a leitura.

    []´s 

    • Marcado como Resposta TI DEV terça-feira, 18 de março de 2014 14:51
    segunda-feira, 17 de março de 2014 17:22
  • Olá,

    Na verdade trabalho com Sharepoint.

    No sharepoint temos um recurso (BCS) que permite a conexão com a base SQL.

    Estou utilizando o sharepoint para acessar a view.

    Entretanto,

    Eu criei um script com order by e tudo para montar a view.

    Quando executo este script a ordenação funciona bem, mas depois que eu "transformo" este script em View, o mesmo perde a ordenação quando executo a view ainda no SQL.

    Acho que o problema está no sql e não na consulta externa da view.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    • Editado TI DEV segunda-feira, 17 de março de 2014 17:24
    segunda-feira, 17 de março de 2014 17:23
  • Olá,

    Na verdade trabalho com Sharepoint.

    No sharepoint temos um recurso (BCS) que permite a conexão com a base SQL.

    Estou utilizando o sharepoint para acessar a view.

    Entretanto,

    Eu criei um script com order by e tudo para montar a view.

    Quando executo este script a ordenação funciona bem, mas depois que eu "transformo" este script em View, o mesmo perde a ordenação quando executo a view ainda no SQL.

    Acho que o problema está no sql e não na consulta externa da view.

    Abs


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    k2rto'4,

    Agora ficou mais claro, na verdade utilizar o ORDER BY dentro de uma VIEW não é uma boa prática porque a view sempre irá ordenar seus dados como indicado em seu script, se você adicionar outra cláusula ORDER BY fora da VIEW sua consulta irá efetuar uma ordenação de dados mais de uma vez e dependendo do caso em sentidos opostos, gerando lentidão.

    De qualquer forma, dentro de uma VIEW você pode adicionar à instrução TOP 100 PERCENT para que retorne todos os dados da consulta, porém isto possibilita adicionar a ordenação dentro da VIEW.

    Veja um exemplo desta execução neste post do Blog MSDN:

    http://blogs.msdn.com/b/fcatae/archive/2010/04/17/desafio-usando-order-by-dentro-de-uma-view.aspx

    Não esqueça de marcar como resposta todos os posts que ajudaram na solução !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Marcado como Resposta TI DEV terça-feira, 18 de março de 2014 14:52
    segunda-feira, 17 de março de 2014 17:40
    Moderador
  • Entendi,

    Após clicar na view e ir em Script de Execução Como -> Alter Para -> janela do editor de consulta temos:

    SELECT    TOP (100) PERCENT CampoA, CampoB + CampoC as MeuCampo,
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY MeuCampo

    Ele sozinho colocou o Percent na primeira coluna.

    Aí te pergunto:

    Como que faço o percente para a minha coluna "CampoB + CampoC as MeuCampo" ?

    Será que é só alterar isto que resolve?

    Obrigado


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    segunda-feira, 17 de março de 2014 17:52
  • Entendi,

    Após clicar na view e ir em Script de Execução Como -> Alter Para -> janela do editor de consulta temos:

    SELECT    TOP (100) PERCENT CampoA, CampoB + CampoC as MeuCampo,
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY MeuCampo

    Ele sozinho colocou o Percent na primeira coluna.

    Aí te pergunto:

    Como que faço o percente para a minha coluna "CampoB + CampoC as MeuCampo" ?

    Será que é só alterar isto que resolve?

    Obrigado


    K2rto'4 - Analista Sharepoint
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    K2rto'4,

    Na verdade o TOP 100 PERCENT servirá para toda sua consulta.

    No caso do seu ORDER BY, será necessário separar os campos, como exibi anteriormente. Veja abaixo:

    SELECT    TOP (100) PERCENT CampoA, 
    CampoB + CampoC as MeuCampo
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY CampoB, CampoC

    Após este ajuste atualize sua VIEW para gravar esta alteração de script.

    Não esqueça de marcar como resposta todos os posts que ajudaram na solução !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 17 de março de 2014 17:59
    Moderador
  • é só colocar a formação do campo "meu campo" no order by, como fez no post #1:

    SELECT    top 100 percent CampoA, CampoB + CampoC as MeuCampo,
    FROM      dbo.TABELA
    WHERE     (CampoA <> 'S') AND (CampoA <> 'W')
    ORDER BY (CampoB + CampoC)
    No caso utilizar Alias em order by gera erro:
    http://msdn.microsoft.com/pt-br/library/ee240807(v=sql.120).aspx

    []´s


    segunda-feira, 17 de março de 2014 18:52
  • Deleted
    segunda-feira, 17 de março de 2014 20:56
  • Deleted
    terça-feira, 18 de março de 2014 09:46
  • Use esse comando para fazer um ranking. Irá funcionar.

    SELECT TOP 10 WITH TIES
        Nome + ‘ ‘ + NomeDoMeio + ‘ ‘ + SobreNome AS NomeCompleto,
        CPF, DataCad, CEP FROM tblClientes
    ORDER BY DataCad

    quinta-feira, 21 de novembro de 2019 17:09