web-dev-qa-db-fra.com

Combinaison ORDER BY ET UNION dans SQL Server

Comment obtenir le premier enregistrement d'une table et le dernier enregistrement d'une table dans un jeu de résultats?

Cette requête échoue

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

De l'aide?

46
Faizal Balsania

Mettre votre order by et top dans les sous-requêtes:

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
67
Keith
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
9
RichardTheKiwi

Si vous travaillez sur SQL Server 2005 ou version ultérieure:

; 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

Le seul endroit où cela ne sera pas comme votre requête d'origine est s'il n'y a qu'une seule ligne dans le tableau (auquel cas ma réponse renvoie une ligne, tandis que la vôtre retournerait deux fois la même ligne)

8
SELECT TOP 1 Id as sameColumn,Name FROM Locations 
UNION ALL
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC
5
Siddappa Walake