vistas vista una personalizado ordenar ejemplos como sql-server database tsql view sql-server-2008-r2

sql-server - vista - order by view sql server



Crear una vista con la cláusula ORDER BY (9)

Desde Sql 2012 puede forzar pedidos en vistas y subconsultas con OFFSET

SELECT C.CustomerID, C.CustomerName, C.CustomerAge FROM dbo.Customer C ORDER BY CustomerAge OFFSET 0 ROWS;

Advertencia: esto solo debe usarse en listas pequeñas porque OFFSET obliga a que se evalúe la vista completa, incluso si otras combinaciones o filtros en la vista reducen su tamaño.

No hay una buena manera de forzar el orden en una vista sin un efecto secundario realmente y por una buena razón.

Intento crear una vista con una cláusula ORDER BY . Lo he creado con éxito en SQL Server 2012 SP1, pero cuando intento volver a crearlo en SQL Server 2008 R2, aparece este error:

Msg 102, nivel 15, estado 1, procedimiento TopUsers, línea 11
Sintaxis incorrecta cerca de ''OFFSET''.

El código para crear la vista es

CREATE View [dbo].[TopUsersTest] as select u.[DisplayName] , sum(a.AnswerMark) as Marks From Users_Questions us inner join [dbo].[Users] u on u.[UserID] = us.[UserID] inner join [dbo].[Answers] a on a.[AnswerID] = us.[AnswerID] group by [DisplayName] order by Marks desc OFFSET 0 ROWS

=====================

Esta es una captura de pantalla del diagrama

Deseo devolver el UserTotalMarks los usuarios y las UserTotalMarks y ordenar este desc de resultados, de modo que el usuario con el mayor resultado esté en la parte superior.


El error es: FROM (SELECT empno,name FROM table1 where location = ''A'' ORDER BY emp_no)

Y la solución es: FROM (SELECT empno,name FROM table1 where location = ''A'') ORDER BY emp_no


El servidor Sql nos proporciona la revisión para que podamos crear una vista con ORDER BY

aqui esta el link

Micorosft HotFix SQL Server

espero que ayude


No estoy seguro de lo que crees que está logrando esta ORDER BY ? Incluso si pone ORDER BY en la vista de una manera legal (por ejemplo, agregando una cláusula TOP ), si solo selecciona de la vista, por ejemplo, SELECT * FROM dbo.TopUsersTest; sin una cláusula ORDER BY , SQL Server puede devolver las filas de la manera más eficiente, lo que no necesariamente coincidirá con el orden esperado. Esto se debe a que ORDER BY está sobrecargado, ya que trata de cumplir dos propósitos: ordenar los resultados y dictar qué filas incluir en TOP . En este caso, TOP siempre gana (aunque dependiendo del índice elegido para escanear los datos, puede observar que su orden está funcionando como se esperaba, pero esto es solo una coincidencia).

Para lograr lo que desea, debe agregar su cláusula ORDER BY a las consultas que extraen datos de la vista, no al código de la vista en sí.

Entonces su código de vista debería ser:

CREATE VIEW [dbo].[TopUsersTest] AS SELECT u.[DisplayName], SUM(a.AnswerMark) AS Marks FROM dbo.Users_Questions AS uq INNER JOIN [dbo].[Users] AS u ON u.[UserID] = us.[UserID] INNER JOIN [dbo].[Answers] AS a ON a.[AnswerID] = uq.[AnswerID] GROUP BY u.[DisplayName];

El ORDER BY tiene sentido, por lo que ni siquiera debería incluirse.

Para ilustrar, usando AdventureWorks2012, aquí hay un ejemplo:

CREATE VIEW dbo.SillyView AS SELECT TOP 100 PERCENT SalesOrderID, OrderDate, CustomerID , AccountNumber, TotalDue FROM Sales.SalesOrderHeader ORDER BY CustomerID; GO SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue FROM dbo.SillyView;

Resultados:

SalesOrderID OrderDate CustomerID AccountNumber TotalDue ------------ ---------- ---------- -------------- ---------- 43659 2005-07-01 29825 10-4020-000676 23153.2339 43660 2005-07-01 29672 10-4020-000117 1457.3288 43661 2005-07-01 29734 10-4020-000442 36865.8012 43662 2005-07-01 29994 10-4020-000227 32474.9324 43663 2005-07-01 29565 10-4020-000510 472.3108

Y puede ver en el plan de ejecución que TOP y ORDER BY han sido completamente ignorados y optimizados por SQL Server:

No hay ningún operador TOP en absoluto, y ningún tipo. SQL Server los ha optimizado completamente.

Ahora, si cambia la vista para decir ORDER BY SalesID , entonces obtendrá el orden que indica la vista, pero solo, como se mencionó anteriormente, por coincidencia.

Pero si cambia su consulta externa para realizar la ORDER BY que deseaba:

SELECT SalesOrderID, OrderDate, CustomerID, AccountNumber, TotalDue FROM dbo.SillyView ORDER BY CustomerID;

Obtiene los resultados ordenados de la manera que desea:

SalesOrderID OrderDate CustomerID AccountNumber TotalDue ------------ ---------- ---------- -------------- ---------- 43793 2005-07-22 11000 10-4030-011000 3756.989 51522 2007-07-22 11000 10-4030-011000 2587.8769 57418 2007-11-04 11000 10-4030-011000 2770.2682 51493 2007-07-20 11001 10-4030-011001 2674.0227 43767 2005-07-18 11001 10-4030-011001 3729.364

Y el plan todavía ha optimizado el TOP / ORDER BY en la vista, pero se agrega una ordenación (a un costo no menor, tenga en cuenta) para presentar los resultados ordenados por CustomerID :

Por lo tanto, moraleja de la historia, no coloque ORDER BY en las vistas. Ponga ORDER BY en las consultas que los referencian. Y si la clasificación es costosa, podría considerar agregar / cambiar un índice para respaldarlo.


Para agregar un ORDER BY a una Vista Realice lo siguiente

CREATE VIEW [dbo].[SQLSTANDARDS_PSHH] AS SELECT TOP 99999999999999 Column1, Column2 FROM dbo.Table Order by Column1


Por favor prueba la siguiente lógica.

SELECT TOP(SELECT COUNT(SNO) From MyTable) * FROM bar WITH(NOLOCK) ORDER BY SNO


Simplemente use TOP 100 Percent en Select:

CREATE VIEW [schema].[VIEWNAME] ( [COLUMN1], [COLUMN2], [COLUMN3], [COLUMN4]) AS SELECT TOP 100 PERCENT alias.[COLUMN1], alias.[COLUMN2], alias.[COLUMN3], alias.[COLUMN4] FROM [schema].[TABLENAME] AS alias ORDER BY alias.COLUMN1 GO


Tuve éxito forzando que la vista se ordenara usando

SELECT TOP 9999999 ... ORDER BY something

Lamentablemente, usar SELECT TOP 100 PERCENT no funciona debido al problema here .


usar el procedimiento

Crear proc MyView como begin SELECT TOP 99999999999999 Column1, Column2 FROM dbo.Table Order by Column1 end

ejecutar procedimiento

ejecutivo MyView