database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 1074 게시물 읽기
No. 1074
[급:질문]top , rownum과 같이 라인수 주는 방법있나요?
작성자
강선규
작성일
2005-01-31 11:41
조회수
13,453

안녕하세요^^

지금 사이베이스로 개발을 하고 있는데,

방대한 데이터를 처리하는데(약 100,000 정도 되는거 같네여...ㅡ.,ㅡ;),

100개의 데이터씩 볼수 있게 하는

top , rownum과 같이 라인수 주는 방법있나요?

부탁드립니다.

이 글에 대한 댓글이 총 3건 있습니다.

 

프리챌 DW개발자모임 커뮤니테에 있는 글을 올립니다. 도움이 되었으면 합니다.

 

[1] SET ROWCOUNT nn 사용하기

1> set rowcount 10
2> go
1> select foo
2> from bar
3> order by barID desc
4> go
그렇다면, 100번째부터 150번째까지를 가져오려면??
[2] 임시테이블을 사용한다면,
set rowcount 150

select rowid = identity(3),
       col1,
       col2
  into #tempA
  from masterTable
 where clause...
 order by 2,3

처럼 rowid라는 칼럼을 identity(3)으로 생성하면 1번부터 번호가 부여된다.
그런 다음,
select * from #tmepA
where rowid between 100 and 150
하면 된다.
사용한 temp 테이블은 세션이 끊기면 자동으로 제거되지만
drop table #tempA를 해주는것이 좋겠다.
[3] 150건을 먼저 temp에 넣고 100건을 삭제하는 건 어쩔까?
set rowcount 150

select col1,
       col2
  into #tempA
  from masterTable
 where clause...

set rowcount 100
delete #tempA
select * from #tempA
 
[4] 임시 테이블을 사용하지 않고 처리하는 방법??
테이블에 identity 칼럼을 만들어 놓고,
다음과 같은 조회용 프로시저를 만들어보자.
사용법?
-- 레코드 100번부터 50건 조회한다면
exec proc_my_view(50, 3) 
 
CREATE PROCEDURE proc_my_view
    @perpage    INT,
    @pagenumber INT
WITH RECOMPILE
AS

   -- 페이지 번호가 1인 경우는 아주 쉽네요. set rowcount 사용하면 되니까
   IF @pagenumber = 1
   BEGIN
      SET ROWCOUNT @perpage

      SELECT ...
      RETURN
   END

   -- 페이지가 1보다 큰 경우에는 시작할 레코드 번호를 구해서
   DECLARE @min_postid NUMERIC( 8, 0 ),
           @position   INT

   SELECT @position = @perpage * ( @pagenumber - 1 ) + 1

   SET ROWCOUNT @position

   -- 해당 레코드까지 이동해 가자. 물론, set rowcount를 이용해서
   SELECT @min_postid = postid
     FROM post
    WHERE ...
    ORDER BY postid ASC

   SET ROWCOUNT @perpage

   -- we know where we want to go (say the 28th post in a set of 50).
    SELECT ...
      FROM post
     WHERE postid >= @min_postid
           ...
  ORDER BY postid ASC
장형운(좋은구름)님이 2005-02-01 09:45에 작성한 댓글입니다.

 

다음은 직접 구현하여 테스트한 예제입니다.

MYTABLE 이라는 테이블이 있습니다.

create table MYTABLE

(

seqnum numeric(10,0) identity not null,

subject varchar(100) null,

context varchar(250) null,

writer char(10) null

)

 

이 테이블은 identity 속성에 의해 seqnum 컬럼에 데이터 입력시 자동으로 순번이 들어가겠지요.

 

다음은 proc_mytable_view라는 프로시저를 만들어서

게시판 조회할 때 호출합니다.

 

CREATE PROCEDURE proc_mytable_view
    @perpage    INT,
    @pagenumber INT
WITH RECOMPILE
AS

   -- 페이지 번호가 1인 경우는 아주 쉽네요. set rowcount 사용하면 되니까
   IF @pagenumber = 1
   BEGIN
      SET ROWCOUNT @perpage

      SELECT * from MYTABLE order by seqnum
      RETURN
   END

 

   -- 페이지가 1보다 큰 경우에는 시작할 레코드 번호를 구해서
   DECLARE @min_seqnum NUMERIC(8, 0),
           @position   INT

   SELECT @position = @perpage * ( @pagenumber - 1 ) + 1

 

   SET ROWCOUNT @position

 

   -- 해당 레코드까지 이동해 가자. 물론, set rowcount를 이용해서
   SELECT @min_seqnum = seqnum
     FROM MYTABLT
    ORDER BY seqnum ASC

 

   SET ROWCOUNT @perpage

 

    SELECT *
      FROM MYTABLE
     WHERE seqnum >= @min_seqnum
    ORDER BY seqnum ASC
go

 

이제 테스트해 볼까요?

-- 10건씩 첫 페이지

exec proc_mytable_view  10, 1

-- 10건씩 2 페이지

exec proc_mytable_view  10, 2

 

장형운(좋은구름)님이 2005-02-01 10:01에 작성한 댓글입니다.
이 댓글은 2005-02-01 10:07에 마지막으로 수정되었습니다.

장형운님이 작성하신게...모범답안이 될것같네요..

 

sybase ase는 조회page가 뒤쪽(제일 먼저 입력된 자료)일수록

 

page가 많은게 문제죠....(게시판에서...)

 

oracle의 rownum의 기능이 아쉽죠...

 

 

 

12.5.3부터는 top fuction을 제공을 합니다....

 

그걸 활용해 보시는 것도.....(뭐 rowcount랑 별차이는 없는데요....그게 많이 익숙할실듯 해서...)

지연님이 2005-02-01 11:18에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1078한글 문제.. 조합? 완성? [1]
싸이
2005-02-12
5183
1076Sybase 제품군과 가격? [2]
유영란
2005-02-02
6055
1075DB를 접속할때 에러가 뜹니다. [1]
조규선
2005-02-01
5415
1074[급:질문]top , rownum과 같이 라인수 주는 방법있나요? [3]
강선규
2005-01-31
13453
1073ASCII 문자의 변환값. [2]
궁금이
2005-01-31
6258
1072iq 서버에서 프로시져를 실행했을때 나는 에러... [1]
정선경
2005-01-28
5130
1071간단한 업무용 환경구축 ...? [2]
임종선
2005-01-28
4474
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다