【发布时间】:2011-04-05 11:27:08
【问题描述】:
如何在一个结果集中获取表的第一条记录和表的最后一条记录?
此查询失败
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id
UNION ALL
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC
有什么帮助吗?
【问题讨论】:
标签: 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
有什么帮助吗?
【问题讨论】:
标签: sql sql-server sql-order-by union-all
将您的order by 和top 语句放入子查询中:
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
【讨论】:
SELECT * FROM ( SELECT * FROM CTEWithNDCNotNull ORDER BY NDC ASC ) AS NDCNotNull UNION SELECT * FROM ( SELECT * FROM CTEWithNDCNull ORDER BY GPI ASC ) AS NDCNull 我该如何纠正这个问题?
select 之后指定top。如果不指定所需的行数,则无法对 union 进行排序。
TOP?那么如果我不知道我想要多少行,有什么选择呢?
top (@limit)。您可能可以使用 rank over ,但它会更复杂,也不会更快。只要列被索引,这个查询就很快。
如果您使用的是 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
这与您的原始查询不同的唯一地方是表中只有一行(在这种情况下,我的答案返回一行,而您的答案将返回同一行两次)
【讨论】:
union all 替换为union,我的也可以返回一行。在查询分析器中比较它们可能是值得的。
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
【讨论】:
SELECT TOP 1 Id as sameColumn,Name FROM Locations
UNION ALL
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC
【讨论】:
ORDER BY子句,所以如果Id是一个int,但没有排序,你不会得到“第一个”Id,只是一个随机的。假设您的 Id 列是 9 7 4 8 3 1 您的查询将在两组中返回 9,因为 9 在您根本不排序时是列中的第一个,但在降序排序时也是第一个。
TOP 子句也没有ORDER BY。这会让你任意挑选两行。然后你UNION ALL 两个查询并排序结果。太晚了:-)