이것은 알려진 질문이지만 내가 찾은 최고의 솔루션은 다음과 같습니다.
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
행이 많은 테이블이 있습니다. 시간이 많이 걸리기 때문에 해당 쿼리를 사용할 가능성은 없습니다. ORDER BY를 사용하지 않고 마지막 N 행을 선택하려면 어떻게해야합니까?
편집하다
답변
ROW NUMBER BY PARTITION 기능을 사용하여이를 수행 할 수도 있습니다. 좋은 예는 여기 에서 찾을 수 있습니다 .
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;
답변
JonVD의 코드를 테스트했지만 매우 느립니다.
이 코드는 0이 걸렸습니다.
SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate
FROM Orders where EmployeeID=5
Order By OrderDate DESC
답변
테이블에서 마지막 행 수를 선택하려는 경우.
구문은 다음과 같습니다
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 행을 얻을 수 있지만 순서는 descnding 방법을 보여줍니다
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)
답변
매우 일반적인 방법으로 SQL 서버를 지원하는 방법은 다음과 같습니다.
SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC
그리고 성능면에서 나쁘지 않습니다 (서버 시스템에서 10,000 개 이상의 레코드에 대해 1 초 미만)
답변
“Id”가 색인되어 있습니까? 그렇지 않다면, 그것은 중요한 일입니다 (이미 색인되어 있다고 생각합니다).
또한 모든 열을 반환해야합니까? 실제로 ID 열의 색인에 의해 완전히 수용 될 수있는 더 작은 열의 하위 집합 만 필요한 경우 (예 : ID 열에 NONCLUSTERED 색인이 있고 다른 열이없는 경우) 속도가 크게 향상 될 수 있습니다. 인덱스에 포함 된 필드의 경우 실제로 클러스터링 된 인덱스에서 조회를 수행하여 나머지 열을 실제로 반환해야하므로 쿼리 비용이 많이들 수 있습니다. CLUSTERED 인덱스이거나 쿼리에 반환하려는 다른 모든 필드를 포함하는 NONCLUSTERED 인덱스이면 괜찮을 것입니다.
답변
먼저 가장 많은 기록을 얻습니다.
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