这是一个已知的问题,但是我发现的最佳解决方案是:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
我的桌子上有很多行。使用该查询不是一种可能,因为它会花费很多时间。那么如何在不使用ORDER BY的情况下选择最后N行呢?
编辑
对不起,这个重复的问题
id
已建立索引,则它将反向扫描该索引,并在前5行之后停止。如果未索引,则需要进行TOP N
排序。这不会比其他任何方式都要糟糕。它不会对整个表进行排序(尽管它需要扫描整个表)
这是一个已知的问题,但是我发现的最佳解决方案是:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
我的桌子上有很多行。使用该查询不是一种可能,因为它会花费很多时间。那么如何在不使用ORDER BY的情况下选择最后N行呢?
编辑
对不起,这个重复的问题
id
已建立索引,则它将反向扫描该索引,并在前5行之后停止。如果未索引,则需要进行TOP N
排序。这不会比其他任何方式都要糟糕。它不会对整个表进行排序(尽管它需要扫描整个表)
Answers:
您也可以使用“按分区行数”功能来完成此操作。一个很好的例子可以在这里找到:
我正在使用Northwind数据库的Orders表...现在让我们检索Employee 5下的最后5个订单:
SELECT ORDERID, CUSTOMERID, OrderDate FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,* FROM Orders ) as ordlist WHERE ordlist.EmployeeID = 5 AND ordlist.OrderedDate <= 5
您可以使用以下SQL使SQL Server选择最后N行:
select * from tbl_name order by id desc limit N;
如果要从表中选择最后的行数。
语法会像
select * from table_name except select top
(numbers of rows - how many rows you want)* from table_name
这些陈述有效,但方式不同。感谢你们。
select * from Products except select top (77-10) * from Products
这样,您可以获得最后10行,但顺序将显示降序方式
select top 10 * from products
order by productId desc
select * from products
where productid in (select top 10 productID from products)
order by productID desc
select * from products where productID not in
(select top((select COUNT(*) from products ) -10 )productID from products)
首先,您最多会从
Declare @TableRowsCount Int
select @TableRowsCount= COUNT(*) from <Your_Table>
然后 :
在SQL Server 2012中
SELECT *
FROM <Your_Table> As L
ORDER BY L.<your Field>
OFFSET <@TableRowsCount-@N> ROWS
FETCH NEXT @N ROWS ONLY;
在SQL Server 2008中
SELECT *
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, *
FROM <Your_Table>
Order By <your Field>
) AS TempTable
WHERE sequencenumber > @TableRowsCount-@N
这可能不太适合该问题,但是…
该OFFSET number
子句使您可以跳过许多行,然后在那之后返回行。
该文档链接指向Postgres。我不知道这是否适用于Sybase / MS SQL Server。
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
我用来查询非常大的表(100+百万或1+十亿行)中最最近的行的一种技术限制为仅“读取”最近行的“ N”百分比。这是真实的应用程序,例如,我对非历史性的“最近的天气”数据,“最近的”新闻提要搜索或“最近的GPS”位置数据点数据执行此操作。
例如,如果您确定您的行位于表的最新TOP 5%中,那么这将是巨大的性能改进。这样,即使在表上有索引,它也进一步将可能性限制为表中具有100+万或1+十亿行的行的5%。当较旧的数据将需要物理磁盘读取而不仅是逻辑内存写入时,尤其是在这种情况下读取。
这比SELECT TOP |效率更高。PERCENT | LIMIT(限制),因为它不选择行,而仅限制要搜索的数据部分。
DECLARE @RowIdTableA BIGINT
DECLARE @RowIdTableB BIGINT
DECLARE @TopPercent FLOAT
-- Given that there is an Sequential Identity Column
-- Limit query to only rows in the most recent TOP 5% of rows
SET @TopPercent = .05
SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA
SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB
SELECT *
FROM TableA a
INNER JOIN TableB b ON a.KeyId = b.KeyId
WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND
a.SomeOtherCriteria = 'Whatever'
要显示最后三行而不使用order by
:
select * from Lms_Books_Details where Book_Code not in
(select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details)
尝试使用EXCEPT
语法。
像这样:
SELECT *
FROM clientDetails
EXCEPT
(SELECT TOP (numbers of rows - how many rows you want) *
FROM clientDetails)
也许有些晚,但是这里有一个简单的选择可以解决您的问题。
SELECT * FROM "TABLE" T ORDER BY "T.ID_TABLE" DESC LIMIT 5;