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 24097 게시물 읽기
No. 24097
장진주님 재질문
작성자
퓨쳐
작성일
2005-09-14 20:05ⓒ
2005-09-15 10:31ⓜ
조회수
1,479

답변해 주셔서 감사합니다.^^

테스트 하던중 문제점이 있는걸 발견했습니다.

C 테이블의 TMP로 조회한 결과 Data가 단일행으로

존재하는 경우엔 원하는 값이 나오지 않는군요.

 

예를들어 각 테이블의 데이터가 아래와 같을 경우에

C테이블의 TMP = 'X' 로 조회하는 경우

최종 데이터가 GRP1,GRP2 두개가 나오게 됩니다.

 

A 테이블

GRP1

1

GRP2

2

GRP3

3

GRP4

4



B테이블

GRP1 A
GRP1 B
GRP2 A
GRP3 C
GRP4 C
GRP4 D

C테이블

X A
Y B
Z C


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

그렇군요. 문제가 있네요.

살펴보고 다시 올리겠습니다.

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-15 11:45에 작성한 댓글입니다.

한가지를 처리 안해줬었네요.

기존 쿼리와 수정된 쿼리를 올립니다. 빨간색 부분을 바꿔주시고 테스트 해보세요.

 

-- 기존 쿼리

SELECT *
  FROM a
 WHERE a.grp IN (
          SELECT   b.grp
              FROM b
             WHERE b.cd IN (SELECT c.cd
                              FROM c
                             WHERE c.tmp = :tmp_value)
          GROUP BY b.grp
            HAVING COUNT (*) >= (SELECT COUNT (*)
                                   FROM b bb
                                  WHERE bb.grp = b.grp) AND COUNT (*) > 1
          UNION
          SELECT   b.grp
              FROM b
             WHERE b.cd IN (
                      SELECT c.cd
                        FROM c
                       WHERE c.tmp = :tmp_value
                         AND c.cd NOT IN (
                                SELECT DISTINCT b.cd
                                           FROM b
                                          WHERE b.grp IN (
                                                   SELECT   b.grp
                                                       FROM b
                                                      WHERE b.cd IN (
                                                               SELECT c.cd
                                                                 FROM c
                                                                WHERE c.tmp =
                                                                         :tmp_value)
                                                   GROUP BY b.grp
                                                     HAVING COUNT (*) >=
                                                               (SELECT COUNT
                                                                           (*)
                                                                  FROM b bb
                                                                 WHERE bb.grp =
                                                                          b.grp)
                                                        AND COUNT (*) > 1)))
          GROUP BY b.grp
            HAVING COUNT (*) = 1)

 

-- 수정된 쿼리

SELECT *
  FROM a
 WHERE a.grp IN (
          SELECT   b.grp
              FROM b
             WHERE b.cd IN (SELECT c.cd
                              FROM c
                             WHERE c.tmp = :tmp_value)
          GROUP BY b.grp
            HAVING COUNT (*) >= (SELECT COUNT (*)
                                   FROM b bb
                                  WHERE bb.grp = b.grp) AND COUNT (*) > 1
          UNION
          SELECT   b.grp
              FROM b
             WHERE b.cd IN (
                      SELECT c.cd
                        FROM c
                       WHERE c.tmp = :tmp_value
                         AND c.cd NOT IN (
                                SELECT DISTINCT b.cd
                                           FROM b
                                          WHERE b.grp IN (
                                                   SELECT   b.grp
                                                       FROM b
                                                      WHERE b.cd IN (
                                                               SELECT c.cd
                                                                 FROM c
                                                                WHERE c.tmp =
                                                                         :tmp_value)
                                                   GROUP BY b.grp
                                                     HAVING COUNT (*) >=
                                                               (SELECT COUNT
                                                                           (*)
                                                                  FROM b bb
                                                                 WHERE bb.grp =
                                                                          b.grp)
                                                        AND COUNT (*) > 1)))
          GROUP BY b.grp
            HAVING (SELECT COUNT (*)
                      FROM b bb
                     WHERE bb.grp = b.grp) = 1

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-15 12:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
24101급합니다. 9i Client에서 10g로 접속하여 export시 에러... [6]
이무기
2005-09-15
7473
24100저기...mview가 뭔가요? [1]
궁금이
2005-09-15
1632
24098new system에 oracle 탑재에 관한 질문 [3]
짱장군
2005-09-15
1031
24097장진주님 재질문 [2]
퓨쳐
2005-09-14
1479
24096select insert구문시 plan변경현상을 다시 질문드립니다. [3]
현실긍정
2005-09-14
1801
24094세션 트레이스 시 [1]
이은주
2005-09-14
1107
24092[질문]테이블 컬럼을 동적으로 가져오기 [2]
아더
2005-09-14
1697
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다