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
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