在SQL Server中组合ORDER BY和UNION

Fai*_*nia 46 sql sql-server sql-order-by union-all

如何在一个结果集中获取表的第一条记录和表的最后记录?

此查询失败

SELECT TOP 1 Id,Name FROM Locations ORDER BY Id
UNION ALL
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Kei*_*ith 70

将您的order bytop语句放入子查询中:

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
Run Code Online (Sandbox Code Playgroud)

  • @peplamb您必须在子查询“ select”之后指定“ top”。如果不指定所需的行数,就无法对“联合”进行排序。 (2认同)

Ric*_*iwi 9

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
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 8

如果您正在使用SQL Server 2005或更高版本:

; 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
Run Code Online (Sandbox Code Playgroud)

唯一不会像原始查询一样的地方是表中只有一行(在这种情况下,我的答案会返回一行,而你的答案会返回同一行两次)


Sid*_*ake 5

SELECT TOP 1 Id as sameColumn,Name FROM Locations 
UNION ALL
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC
Run Code Online (Sandbox Code Playgroud)

  • 这与现有答案有何不同? (2认同)
  • 这是一个旧答案,但由于它是错误的,我建议您无论如何删除它,以免让任何人感到困惑。您有两个查询,两者都没有“TOP”子句,也没有“ORDER BY”。这会让你任意选择两行。然后将两个查询“UNION ALL”并对结果进行排序。为时已晚 :-) (2认同)