2011-04-05 13 views
32

¿Cómo puedo obtener el primer registro de una tabla y el último registro de una tabla en un conjunto de resultados?Combinación de ORDER BY AND UNION en SQL Server

falla esta consulta

SELECT TOP 1 Id,Name FROM Locations ORDER BY Id 
UNION ALL 
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC 

Cualquier ayuda?

Respuesta

52

Ponga sus order by y top declaraciones en sub-consultas:

select first.Id, first.Name 
from (
    select top 1 * 
    from Locations 
    order by Id) first 
union all 
select last.Id, last.Name 
from (
    select top 1 * 
    from Locations 
    order by Id desc) last 
+0

Keith Estoy utilizando SQL Server 2005 y cuando lo haga, según lo sugerido por que me sale el siguiente error, La cláusula ORDER BY no es válida en vistas, funciones en línea, tablas derivadas subconsultas, y expresiones de tabla común, a menos que también se especifique TOP o FOR XML. Cuando intento lo siguiente, SELECT * FROM ( \t SELECT * FROM CTEWithNDCNotNull ORDER BY NDC ASC ) AS NDCNotNull UNION SELECT * FROM ( \t SELECT * FROM CTEWithNDCNull ORDER BY GPI ASC ) AS NDCNull ' ¿Cómo puedo corregir esto? –

+1

@peplamb Tienes que especificar 'top' después de la sub-consulta' select'. No puede ordenar una 'unión' sin especificar cuántas filas desea. – Keith

7
select * from (
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id) X 
UNION ALL 
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC 
8

Si está trabajando en SQL Server 2005 o posterior:

; WITH NumberedRows as (
    SELECT Id,Name, 
     ROW_NUMBER() OVER (ORDER BY Id) as rnAsc, 
     ROW_NUMBER() OVER (ORDER BY Id desc) as rnDesc 
    FROM 
     Locations 
) 
select * from NumberedRows where rnAsc = 1 or rnDesc = 1 

El único lugar este won' t ser como su consulta original si solo hay una fila en la tabla (en cuyo caso mi respuesta arroja una fila, mientras que la suya devolvería la misma fila dos veces)

+0

Buena respuesta alternativa, aunque la mía podría devolver una fila también si reemplaza 'union all' con' union'. Podría valer la pena compararlos en el analizador de consultas. – Keith

0
SELECT TOP 1 Id as sameColumn,Name FROM Locations 
UNION ALL 
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC 
+2

¿En qué se diferencia esto de las respuestas existentes? – TheGameiswar

+0

Primero necesitamos tener los mismos nombres de columna para usar las uniones. Así que acabo de usar el mismo alias en ambas vistas para ordenar. –