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
운영게시판
최근게시물
Oracle Q&A 31539 게시물 읽기
No. 31539
조회에 관해서 질문 드립니다.
작성자
정명규
작성일
2007-08-05 01:59
조회수
1,689

테이블이
고객번호              출고일자               통합번호
(reader_cd)         (exp_dt)                (totreader_cd)
00000001             2007-01-01                       1
00000002             2007-02-01                       1
00000003             2007-03-01                       1
00000004             2007-04-01                       1
00000005             2007-05-01                       1
00000006             2007-01-01                       2
00000007             2007-02-01                       2
00000008             2007-03-01                       2
00000009             2007-04-01                       2
00000010             2007-05-01                       2
고객번호를 입력하면 통합독자번호별로 묶어서
그중에 입력된독자번호보다 크고, 작은 출고일자를 구할려고 합니다.
예를들어 고객번호  00000003을 입력하면 통합번호1번을 묶어서
00000003번의 출고일자 2007-03-01보다 작은 2007-02-01과 
큰 2007-04-01을 출력하고자 합니다.
답변을 부탁드립니다.

SELECT MIN(DECODE(GUBUN,1,dt,NULL)) min_dt,  MAX(DECODE(GUBUN,2,dt,NULL)) max_dt
  FROM (
        SELECT 1 GUBUN, MAX(reader_cd) dt
          FROM custor
         WHERE totreader_cd = (SELECT totreader_cd FROM custor
                            WHERE reader_cd = '2345678')
           AND exp_dt < (SELECT exp_dt FROM custor
                            WHERE reader_cd = '2345678')
        UNION ALL
        SELECT 2, MIN(reader_cd)
          FROM custor
         WHERE totreader_cd = (SELECT totreader_cd FROM custor
                            WHERE reader_cd = '2345678')
           AND exp_dt > (SELECT exp_dt FROM custor
                            WHERE reader_cd = '2345678')
       )

이 sql문으로 실행을 하면 2분가까이 걸립니다.

독자 조회시에 같이 조회가 되는데 이 구문에서 2분가까이 걸려 조회속도가 너무 느려 집니다.

어떻게 해야 조회속도를 빠르게 할수 있을까요....

답변을 부탁드립니다.

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

문제를 보면서 질문이 좀 생겼는데..

일단 통합번호가 1인데 출고일자가 2007-05-01 이면 min값만 나오고 max값은 나오지 않아야 한다고 생각을 하고 만들었습니다.

또 날짜가 나오는게 아닌 고객번호를 구하려고 하는것 같은데요.??

암튼..

select reader_cd, min_dt, max_dt
  from (select reader_cd, exp_dt, totreader_cd,
               lag(reader_cd) over(order by reader_cd, exp_dt) as min_dt,
               lead(reader_cd) over(order by reader_cd, exp_dt) as max_dt
          from custor a
         where exists (select 'Y' from custor
                        where totreader_cd = a.totreader_cd
                          and reader_cd = '00000003'))
 where reader_cd = '00000003'

생각나는게 집계함수인데... 9i부터 되는줄 알았는데, 지금 테스트 환경이

Connected to Oracle8i Enterprise Edition Release 8.1.7.4.0  인데도 저 쿼리가 먹는군요.

select문 적는게 좀 숙스럽네요.. 글적글적.. 참고하세요..

자스민님이 2007-08-05 21:41에 작성한 댓글입니다. Edit

-- 날짜
SELECT  MAX(CASE WHEN T2.exp_dt < T1.exp_dt THEN T2.exp_dt END)
       ,MIN(CASE WHEN T2.exp_dt > T1.exp_dt THEN T2.exp_dt END)
  FROM  custor T1, custor T2
 WHERE  T1.reader_cd    = '00000003'
   AND  T2.totreader_cd = T1.totreader_cd
   AND  T2.reader_cd   <> '00000003'

-- 고객번호
SELECT  MAX(CASE WHEN T2.exp_dt < T1.exp_dt THEN T2.reader_cd END)
       ,MIN(CASE WHEN T2.exp_dt > T1.exp_dt THEN T2.reader_cd END)
  FROM  custor T1, custor T2
 WHERE  T1.reader_cd    = '00000003'
   AND  T2.totreader_cd = T1.totreader_cd
   AND  T2.reader_cd   <> '00000003'

설명은 날짜같고 쿼리는 고객번호같은데 ????

박진복(pjb708)님이 2007-08-06 12:00에 작성한 댓글입니다.
이 댓글은 2007-08-06 12:03에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
31542오라클 DB파일들을 ftp로 업로드시에 문의 드립니다..부탁드립니다.
초보오라클~
2007-08-06
1054
31541프로시저 실행중에 자꾸 멈춰버려요..
차우근
2007-08-06
1333
31540한달에 월요일이 몇번들어가 있는지 알수잇는 방법? [3]
한번만
2007-08-06
1477
31539조회에 관해서 질문 드립니다. [2]
정명규
2007-08-05
1689
31538( ) union ( ) minus ( ) 이런 쿼리에서... [3]
아둥바둥
2007-08-05
1733
31537insert /*+ append */ 하다가 에러났을때 [2]
임선자
2007-08-04
2006
31536오라클 SSL에 대해서 궁금한점이 있습니다.
binilpaper
2007-08-04
1621
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다