2016-12-12 2 views
0

3 개의 테이블이 사용되는 쿼리를 만들었습니다. 첫 번째 표에는 필요한 모든 이름이 있습니다. 두 번째와 세 번째 테이블은 청구서 금액이있는 이름을 알려줍니다. 하지만 첫 번째 테이블의 이름도 모두 필요합니다.외부 조인이 추가 항목을 표시하지 않음

SELECT a.name, 
     nvl(c.bill_amount,0) 
    FROM table_1 a left outer join table_2 b 
    ON a.name = b.name 
    left outer join table_3 c on B.phone_number = C.phone_number 
     AND B.email = C.email 
     where b.status = 'YES' 
     and a.VALID = 'Y'; 

이제 테이블 b와 c는 제한된 수의 이름을 제공합니다. 청구서에 5가 표시됩니다. 그러나 table_1에는 10 개의 이름이 있습니다. 나는 그들의 이름에 0 bill_amount로 그들도 표시하고 싶다. 나는 오라클을 사용하고있다.

+0

변경 위치 : 'where (b.status ='YES '또는 b.status IS NULL)'또는이를 조인 (where 절을 가져옴)에 넣습니다. 'AND b.status ='YES '' –

답변

1

오른손 이야기에 where 절을 적용하면 기본적으로 이모티콘이됩니다. 그것을 OUTER을 유지하기 위해, 조인 조건

의 조건을 넣어

시도 :

SELECT a.name, 
     nvl(c.bill_amount,0) 
FROM table_1 a 
left outer join table_2 b 
    ON a.name = b.name 
    and b.status = 'YES' -- Put it here 
left outer join table_3 c 
    on B.phone_number = C.phone_number 
    AND B.email = C.email 
where a.VALID = 'Y'; -- Only items from the left hand table should go in the where clause 
+0

대부분의 문제가 해결되었지만, 하지만 지금 나는 여분의 데이터를 얻고있다. – Akshay

+0

@Ashshay 중복 데이터? 중복되는 경우 DISTINCT를 사용하십시오. – JohnHC

+0

감사합니다. 그것은 내 문제를 해결 – Akshay

0

위의 대답은 맞다, 난 그냥 더 정확하게 할 것입니다. 왼쪽 조인이 일치하지 않으면 오른쪽 테이블의 열이 NULL으로 설정됩니다.

사실 NULL은 항상 SQL에서 값을 전파하므로 결합이 수학이 아니고 술어가 일치하지 않으면 b.status = 'YES' 값은 NULL입니다.

(b.status = 'YES' or b.name IS NULL) 것이 처리하는 일반적인 방법 : b.name가 null의 조인 열 때문에 경우와 b.status의 경우하지 않을 수있는, 일치하지 않는 조인 경우에만 가능합니다.

NULL이 전파 중이기 때문에 field = NULL 대신 field IS NULL을 사용할 수 없습니다.

하지만 더 명확한 경우 조인 절에 포함 시켜도됩니다.

+0

동일한 문제가 발생했습니다. b.status = '예'조건은 원근감으로 간주되지 않습니다. 그 가치를 지울 때 상태는 NULL입니다. 하지만 나는 상태가 '예'인 결과 만 원한다. – Akshay