자유게시판

시삽: 레드플러스 님 
게시판 이동:
 제목 : 도움이 되실지...(다 아시는건 아닌지...틀릴수도 >.,<)
글번호: 1117
작성자: hatukoi
작성일: 2006/05/17 오후 3:04:00 (2006/05/17 오후 4:56:00 수정)
조회수: 2771
저도 비슷한 기능의 프로시저를 끙끙대며 만든적이 있지만 역시 저도 초짜인지라
팀장님-맞나요?^^;-이 주신걸 대번에 이해하기는 어렵네요 ㅎㅎ
제가 짠것도 아니고 말이죠;;
아무튼 일단 프로시저 보니까 이미 where절까지 갖춰진 것이군요.
소스를 쭉 &#54995;어보니 거의 끝에 있는 select문을 실행하기 전에 그 조건들을 미리 설정하네요.그리고,테이블까지 변수처리 하는것 보니 여러 곳에서 동시에 쓰는 프로시저네요.
변수가 많아서 자칫 헷갈리시겟지만-저도 헷갈립니다;;-그냥 편하게 자신이 넣어줄
값들을 쭉 나열해보심은 어떠신지요.
그걸 변수에 채워넣다보면 어떤 변수를 어느자리에 넣어야 하는지 감이 잡히지 않을까 싶습니다.

일단 실제 조회부분 가면 3가지로 나뉘네요.
1.페이징 없이 그냥 무조건 다 출력
2.페이징 없이 다 출력
3.페이징 있는 검색출력

마지막 3번만 이해 하시면 다 되겟지여...그게 실행되야 하는거구요.

3번쪽 쿼리를 보면

EXEC (
   'SELECT ' + @strFields + ' FROM ' + @strTables + ' WHERE ' + @strPK + ' IN ' + '
     (SELECT TOP ' + @strPageSize + ' ' + @strPK + ' FROM ' + @strTables +
     ' WHERE ' + @strPK + ' NOT IN ' +
     ' (SELECT TOP ' + @strSkippedRows + ' ' + @strPK + ' FROM ' + @strTables + @strFilterCriteria + @strGroupCriteria + @strSortCriteria + ' ) ' +
           @strSimpleFilter +  @strGroupCriteria +   @strSortCriteria + ' ) ' +
           @strGroupCriteria +
           @strSortCriteria
        )
  
   가장 안쪽 쿼리의 핵심은 @strSkippedRows  입니다.
   페이징에 의해 빠질 부분들을 뽑아내는 쿼리 같습니다.즉,실제 보여줘서는 안되는
   부분입니다.그걸 구하는데 보시면 @strPK 만 뽑아냅니다 pk값이죠.
   그런데 페이징과 동시에 이루어져야 할게 검색입니다.
   즉, 단순히 페이징만 이루어지면 전체에서 페이징에서 빠질 부분만 추리므로 실제
   검색으로 인해서 빠져야 할것들이 안빠지죠
   그래서, @strFilterCriteria  부분이 들어갑니다.

   잠깐 보충하자면 저도 얼마전에 깨달은건데 쿼리문에서 가장 먼저 실행되는것은
   from 절 이하부분이라는것입니다.
   즉, from 테이블명 where 조건 order by 정렬 부분을 먼저 해서 원하는 테이블을
   구성 한후에 select 를 한다는 것이죠.

   그 후 그걸 감싸는 쿼리를 보시면 빠져야 할 데이타들의 pk값을 비교하여
   그 pk값이 아닌것들만으로 이루어진 데이타를  출력합니다.
   그런데역시나 같은 검색조건 같은 정렬 같은 그룹바이 변수를 이용합니다.
  
   마지막에는 결국 그 데이타들중에서 pk값이 들어잇는 것들만 골라서 보여줄 필드명을
   출력하는군요

   결론 지어 보면 //여기서 전체데이타는 검색을 거친후의 데이타입니다.
   내가 보여줄 필드 를 출력 from  테이블
   where pk in   (실제 보여줄 데이타 pk값 출력 from 테이블명 where
                     pk not in (전체 데이타중 페이징에 의해 빠지는 데이타의 pk)
                       )
    정도 되는거 같습니다.더 정신없네요;;  

  여기서 주의할점은 페이징시에는 정렬을 똑같이 빼먹지 말고 줘야 한다는 겁니다.
  자칫 잘못하면 제대로 된 패이징이 안되는게 TOP에 의해 최상단 값부터 나오기 때문입니다.
   가장 하위쿼리와 그걸 싸고 잇는 하위쿼리에 있는 조건의 변수가 틀린점도 유의하세요.
   조건(검색조건)이 같은데 왜 변수명이 틀릴까요
    첫번째(@strFilterCriteria)는 바로 where절부터 출발하지만
    두번째것( @strSimpleFilter )은 and로 출발합니다.
    두번째 것은 PK값 Not In (최단 하위쿼리) and 조건...식이기 때문입니다.

     where절이 걱정이시라면 이 부분을 잡아주시면 되겟습니다.
     단,전체문장을 고려해서 띄어쓰기 확실히 해주시구요.검색조건이 난해할 경우
      위 부분이 엄청 길어질수 있습니다.오죽하면 varchar(8000)으로 잡았겟습니까.
     if else구문이야 시샵과 유사하니 아실테구요...

   헉헉 적고 보니 더 정신이 없네요 말로 하면 별거 아닐수 잇는데...
   저도 아는데로 적은거라 틀릴수 있다는 점 알아주시구여 -0-;

P.S 그런데 저 같으면 그냥 이렇게 햇을거 같네요.
       @PageSize - 한번에 보여줄 데이타 수
       @PageNum - 현재 페이지값

      select top @PageSize * from 테이블
      where pk not in
      (
            select top @PageSize*(@PageNum-1) pk from 테이블
            where 검색조건 order by 정렬
       )
       and 검색조건 order by 정렬
 
이전 글   다음 글 삭제 수정 답변 글쓰기 리스트
  hatukoi
  2006-05-17 오후 3:07:07
쿼리에서 문장완성시 박선생님이 강조하신걸 잊지마세요.
'을 표현하려면 '을 3개찍어라! 라는것이요^^;;

(댓글을 남기려면 로그인이 필요합니다.)

관련 아티클 리스트
  제       목 파일 작성자 작성일 조회
이전글 선생님 저번에 말씀하신 책이요.. (4) - 류시경 2006-05-22 3180
  게시판 생각보다 마니어렵네용... (1) - redsignal 2006-05-17 3094
  Re : 게시판 생각보다 마니어렵네용... - hatukoi 2006-05-17 2823
  Re : Re : 게시판 생각보다 마니어렵네용... 고급페이징관련.sql(4 KB) 류시경 2006-05-17 2935
현재글 도움이 되실지...(다 아시는건 아닌지...틀릴수도 >.,<)(1) - hatukoi 2006-05-17 2771
다음글 쌤~~(1) - jklove 2006-05-16 2764
 
손님 사용자 Anonymous (손님)
로그인 Home