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
운영게시판
최근게시물
PostgreSQL Q&A 7031 게시물 읽기
No. 7031
[쿼리질문](1필드)최소값 중에서 (2필드)최대값을 가진 모든필드 가져오기
작성자
작성일
2007-02-01 10:09
조회수
4,172

 질문

5개의 필드가 있습니다.

1필드에서 10000보다 큰 최소값을 구하고 이중에서 3보다 작은 최대값을 구해서 

모두 불러오기를 했는데 더 간단한 방법이 없는지요


예1)--


select *from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2=(select max(필드2)from 테이블 where 필드1=(select min(필드1)from test where 필드1>10000) and 필드2<=3)

=>이것은 됩니다.


select *from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2=(select max(필드2)from 테이블 where 필드2<=3)

=>이것은 해당레코드가 없고 시간이 오래걸리네요

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

먼저번 것의 쿼리 플랜을 한번 보시고 특별히 문제가 없는한 그냥 쓰시는 것이 나을 것 같습니다.

옵티마이저가 잘 작동했다면 가장 효율적일 것 같네요.


쿼리 플랜 결과를 한번 보여주실 수 있나요?


이런 방법도 있기는 한 것 같습니다만... test는 안해봐서 작동이 될지...


select aa.* from 테이블 aa

    JOIN (select b.min_value, max(a.필드2) as max_value

            from 테이블 a

                JOIN (select min(필드1) as min_value

                   from 테이블

                  where 필드1>10000) b

                ON (a.필드1=b.min_value)

        where a.필드 2 <= 3

        group by min_value) bb

    ON (aa.필드1=bb.min_value and aa.필드2=bb.max_value)

박성철(gyumee)님이 2007-02-01 21:12에 작성한 댓글입니다.
이 댓글은 2007-02-01 21:38에 마지막으로 수정되었습니다.

쿼리 플랜(?) 
제가 초보라 이런것 잘 몰라서요
이것 저것 쿼리를 만들어서 하다보니 나왔습니다.

메세지는 
Total query runtime: 10 ms.
Data retrieval runtime: 30 ms.
1 rows retrieved.

제가 쓴 위의 문장이 잘못된것 같습니다.

select *from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2=(select max(필드2)from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2<=3)

밑줄 친 부분입니다.
테이블은 한 개 입니다.

심상호(shimsh)님이 2007-02-02 09:07에 작성한 댓글입니다.

10ms면 충분히 빠르지 않나요? ^^

박성철(gyumee)님이 2007-02-02 11:30에 작성한 댓글입니다.

실제로 속도측정을 해보면 600ms이상나오더라고요
그리고 명령문이 왠지 중복되는 것 같아서요

심상호(shimsh)님이 2007-02-04 19:16에 작성한 댓글입니다.

쿼리 플랜은 explain 명령으로 알 수 있습니다.


explain analyze select *from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2=(select max(필드2)from 테이블 where 필드1=(select min(필드1)from 테이블 where 필드1>10000) and 필드2<=3)


이렇게 해보세요.


비록 같은 쿼리문이 반복되고 있기는 하지만 옵티마이저가 반복해서 처리하지는 않을 것 같은 생각이 드네요. 한번 쿼리 플랜을 떠보죠.

박성철(gyumee)님이 2007-02-05 10:40에 작성한 댓글입니다.
이 댓글은 2007-02-05 15:38에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
7035조회가 안되는데... [3]
초보
2007-02-06
3994
7033update table set field=field+1 in transaction [4]
송효진
2007-02-03
4537
7032win2k3 에 pgsql 8.2.2 설치 방법[업뎃]
송효진
2007-02-02
3884
7031[쿼리질문](1필드)최소값 중에서 (2필드)최대값을 가진 모든필드 가져오기 [5]
2007-02-01
4172
7030win2k3 에 설치 포기... [3]
송효진
2007-02-01
4553
7029버전 sort가 .... 어떻게하죠. [5]
권순용
2007-01-31
3868
7028올바른 sql문의 실패가 나는 경우가 있나요? [2]
권영진
2007-01-30
4369
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다