2011-04-29 7 views
3

다음 두 가지 버전의 ANSI 호환 SQL (기밀 데이터를 보호하기 위해 변경된 열/테이블 이름) 중 하나가 올바른 논리를 따르고 내 요구 사항을 충족하며 다른 하나는 하지 않습니다.오라클 독점 조인 - 여러 조건에 합류

1) ANSI 1 서지

SELECT b.COLUMN_A, 
    COUNT(a.COLUMN_A) 
FROM TABLE1 a 
RIGHT OUTER JOIN 
    (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b 
ON a.COLUMN_A = b.COLUMN_A 
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) --WORKS 
GROUP BY b.COLUMN_A 

1)과 같은 출력을 제공 가입 :

COLUMN_A COUNT(COLUMN_A) 
-------------------------- 
A  0 
B  0 
C  1 
D  1 
E  0 

2) ANSI -2- 나던 작동 가입을

SELECT b.COLUMN_A, 
    COUNT(a.COLUMN_A) 
FROM TABLE1 a 
RIGHT OUTER JOIN 
    (SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b 
ON a.COLUMN_A = b.COLUMN_A 
WHERE 
a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)  --DOESN'T WORK 
GROUP BY b.COLUMN_A 

3) 오라클의 독점적 인 가입 - 작동하지 않음

SELECT b.COLUMN_A, 
    COUNT(a.COLUMN_A) 
FROM TABLE1 a,(SELECT COLUMN_A FROM TABLE2 WHERE COLUMN_X='TEST') b 
WHERE 
a.COLUMN_A(+) = b.COLUMN_A 
AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) --DOESN'T WORK 
GROUP BY b.COLUMN_A 

2) & 3)과 같은 출력을 제공한다 :

COLUMN_A COUNT(COLUMN_A) 
-------------------------- 
C  1 
D  1 

I 독점 (2, ANSI) & (3) 동일 이해한다. 그러나 (1, ANSI)에 대해 독점적 인 SQL이 있습니까? 도움이 될 것입니다. 감사합니다. . 편집 : 샘플 출력으로 질문을 업데이트했습니다.

+0

정보를 추가하여 원하는 내용을 출력하고 잘못된 결과를 얻는 방법을 생각해보십시오. – EvilTeach

답변

6

당신은 아마이 상태 변경하려면 :

AND a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) 

을하는 중이 :

AND a.COLUMN_B (+) in (SELECT FROM TABLE3 WHERE COLUMN_Y=5) 

나이 :

AND (a.COLUMN_B IS NULL OR a.COLUMN_B in (SELECT FROM TABLE3 WHERE COLUMN_Y=5)) 

그러나 일반적으로, 내가 말할 것

가 외부 조인 할 ANSI 구문을 사용합니다. 오라클 구문을 처음 배우고 그것에 익숙한 사람이라 할지라도 ANSI는 외부 조인에 대해 훨씬 더 명확합니다.

+1

ANSI 조인 구문을 사용합니다. Oracle 스타일의 외부 조인을 사용하면 중첩 (하위 쿼리에 외부 조인) 또는 ANSI 조인이 필요한'ORA-01417'을 실행할 수 있습니다. –

+0

감사합니다. 이 작품!. 독점적 인 구문이 그리 깔끔하지 않다는 것에 동의합니다. ANSI 조인이 수행하는 작업을 수행 할 수있는 방법을 알고 싶었습니다. – komedit1