我想从SQL Server中的表中选择最后5条记录,而不是按升序或降序排列表。
答案 0 :(得分:34)
这只是我写过的最离奇的查询,但我很确定它从表中获得了“最后5行”而没有订购:
select *
from issues
where issueid not in (
select top (
(select count(*) from issues) - 5
) issueid
from issues
)
请注意,这利用了SQL Server 2005将值传递给“top”子句的能力 - 它在SQL Server 2000上不起作用。
答案 1 :(得分:28)
假设你有一个关于id的索引,这将是一个快速的:
SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
答案 2 :(得分:10)
你的问题的表达方式使得听起来你认为你必须在表格中实际使用数据,以便按照你想要的顺序恢复它。如果是这样,则不是这种情况,为此目的存在ORDER BY子句。使用ORDER BY时,存储记录的物理顺序保持不变。记录在返回之前在内存中(或在临时磁盘空间中)进行排序。
请注意,如果不使用ORDER BY子句,则无法保证返回记录的顺序。因此,虽然这里的任何建议都可行,但没有理由认为它们会继续工作,也无法证明它们适用于当前数据库的所有情况。这是设计的 - 我假设它是为了给数据库引擎提供与记录一样的自由,以便在没有指定显式顺序的情况下获得最佳性能。
假设您希望按字段名称升序排序的最后5条记录,您可以执行类似的操作,这应该适用于SQL 2000或2005:
select Name
from (
select top 5 Name
from MyTable
order by Name desc
) a
order by Name asc
答案 3 :(得分:10)
select * where index_column> 7
select * from users
where user_id >
( (select COUNT(*) from users) - 5)
您可以订购ASC或DESC
但使用此代码时
select TOP 5 from users order by user_id DESC
不会轻易订购。
答案 4 :(得分:4)
搜索您可以使用此记录的最近记录中的5条记录,
SELECT *
FROM Table Name
WHERE ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
答案 5 :(得分:3)
嗯,“最后五行”实际上是最后五行,具体取决于您的聚集索引。根据定义,您的聚簇索引是对行进行排序的方式。所以如果没有一些订单,你真的无法得到“最后五行”。但是,您可以获得与聚簇索引相关的最后五行。
SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
答案 6 :(得分:3)
select * from table limit 5 offset (select count(*) from table) - 5;
答案 7 :(得分:3)
没有订单,这是不可能的。是什么定义了“底部”?以下将根据它们在数据库中的存储方式选择5行。
SELECT TOP 5 * FROM [TableName]
答案 8 :(得分:2)
如果您没有主键或相同列,请尝试此操作:
select [Stu_Id],[Student_Name] ,[City] ,[Registered],
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from student
ORDER BY RowNum desc
答案 9 :(得分:2)
在SQL Server 2012中,您可以执行以下操作:
Declare @Count1 int ;
Select @Count1 = Count(*)
FROM [Log] AS L
SELECT
*
FROM [Log] AS L
ORDER BY L.id
OFFSET @Count - 5 ROWS
FETCH NEXT 5 ROWS ONLY;
答案 10 :(得分:2)
在mysql中检索最后5行
此查询完美运行
SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC
或
select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
答案 11 :(得分:2)
如果您知道总共有多少行,则可以使用ROW_NUMBER()函数。 以下是来自MSDN(http://msdn.microsoft.com/en-us/library/ms186734.aspx)
的考试USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
答案 12 :(得分:1)
select *
from table
order by empno(primary key) desc
fetch first 5 rows only
答案 13 :(得分:1)
有一个方便的技巧可以在某些数据库中按数据库顺序排序,
SELECT * FROM TableName ORDER BY true
显然,这可以与此处发布的任何其他建议一起使用,将结果保留为“他们从数据库中排出的顺序”顺序,在某些数据库中,这是他们上次修改的顺序。
答案 14 :(得分:1)
当表格中的行数小于5时,Matt Hamilton和msuvajac的答案不正确。 因为TOP N行数值可能不是负数 可以找到一个很好的例子Here。
答案 15 :(得分:1)
我正在使用此代码:
select * from tweets where placeID = '$placeID' and id > (
(select count(*) from tweets where placeID = '$placeID')-2)
答案 16 :(得分:1)
您可以从记忆中检索它们 首先,您获取DataSet中的行,然后从DataSet中获取最后5个。
答案 17 :(得分:0)
感谢@Apps Tawale,基于his answer,这是另一个(我的)版本,
要选择没有标识列的最后5条记录,
select top 5 *,
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
尽管如此,它有一个订单,但在RowNum上:)
注意(1):上述查询将颠倒我们运行主选择查询时获得的顺序。
所以为了维持秩序,我们可以稍微说一下:
select *, RowNum2 = row_number() OVER (ORDER BY (SELECT 0))
from (
select top 5 *, RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
) as t1
order by RowNum2 desc
注意(2):如果没有标识列,查询会在大数据的情况下花费一些时间
答案 18 :(得分:0)
在SQL Server中,如果不在查询中使用排序,这似乎是不可能的。 这就是我用过的。
SELECT *
FROM
(
SELECT TOP 5 *
FROM [MyTable]
ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/
答案 19 :(得分:0)
DECLARE @MYVAR NVARCHAR(100)
DECLARE @step int
SET @step = 0;
DECLARE MYTESTCURSOR CURSOR
DYNAMIC
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
WHILE @step < 10
BEGIN
FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
SET @step = @step + 1;
END
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR
答案 20 :(得分:-1)
获取该表的计数
select count(*) from TABLE
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE)