페이징 하는 여러 방법 : Paging by MS-SQL Server

전에 써 두었던 글에 부가설명을 달고자 한다.

DB에 따라서 페이징에 많이 쓰는 쿼리가 따로들 있다.
MySQL은 limit, Oracle은 rownum, MSSQL은 top...

이 중에서 제일 애먹이는 것인 MSSQL의 top.

그래서 기록해 둔다.

1. select top ... 과 Not in을 이용하는 방법이다.
    페이징 하고자 하는 해당열(nn에서 mm)들을 구하기 위해 전체 구간(1에서 mm)을 top으로 가져오고,
    그런 다음 1에서 nn까지의 상위 구간을 빼 버리는  방법이다. 제일 많이 사용하는 방법이다.

    예) - 준비 중 -

2. 다음과 같이 order by ASC와 DESC를 이용하는 방법도 있다.
    페이징 하고자 하는 데이터들의 표시를 위해  복잡한 중복 소팅을 없는 편이라면,
    이 방법도 나쁘지 않다.  처음에  1부터 mm까지 역순으로 정렬해 가져와서,
    이를 다시 mm에서 nn까지 재역순으로  정렬하는 방법이다.
User-Specific RecordsTo provide paging through user-specific data, you can use SELECT TOP with nested queries. The main advantages of this approach is that it does not require a unique key column of any sort and it also supports advanced navigation, where the user is able to move to the next, previous, first, and last pages, and is also able to move to a specific page.The following pseudocode illustrates this technique.

SELECT TOP CustomerID,CompanyName,ContactName,ContactTitle
FROM (SELECT TOP CustomerID,CompanyName,ContactName,ContactTitle FROM Customers AS T1 ORDER BY ContactName DESC) AS T2 ORDER BY ContactName ASC

The inner SELECT statement selects a set of rows in descending order based (in this example) on the ContactName column. The number of rows selected is equal to the current page number times the page size. The outer SELECT statement then selects the top n rows, where n is the page size, and presents the data in ascending order based on the ContactName column.The following code shows the above pseudocode implemented as a stored procedure that can be used to page through the Customers table in the Northwind database.

출처 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto05.asp

3. 임시 테이블을 이용해서 한번의 top으로 가볍게 구할 수 있다.

    예제 준비 중.


4. 스토어드 프로시져와 커서를 이용해서 페이징 구간을 가져올 수 있다.

이상입니다.

by 혼수상태 | 2007/08/21 23:54 | 트랙백 | 덧글(1)

트랙백 주소 : http://isma44.egloos.com/tb/3710121
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by ㅡ3ㅡ at 2007/08/22 01:44
변형된 1번이겠지만 이렇게도 합니다.

set rowcount에는 변수가 먹거든요. 그래서 50건 / page, 10p인 경우

set @xxx = 50 * 9
set rowcount @xxx

select @no = sn from ....

set rowcount 50

select * from .... where sn > @no

※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지 다음 페이지 ▶