2017-01-24 3 views
0

예상대로 외부 조인을 사용하여 쿼리를 처리하는 데 문제가 있습니다.LEFT JOIN on Oracle

데이터는 다음과 같습니다

TABLE a: 

    id 
    1 
    2 
    3 

TABLE b: 

    id aid 
    11 1 
    12 2 

TABLE c: 

    id bid 
    21 11 
    22 12 

쿼리는 다음과 같습니다

a.id b.id b.aid c.id c.bid 
1  11  1  21  11 
2  12  2  22  12 
3  null null null null 

:

SELECT * 
FROM 
    a 
    LEFT JOIN 
    b 
    ON a.id = b.aid 
    INNER JOIN c 
    ON b.id = c.bid 

내가 모든 a 및 가능한 얻을 필요가이 같은 bc, INNER JOIN은 단지의 연장입니다. 이전 LEFT JOIN과 일치하는 경우입니다. 대신

, 내가 얻을 : 내가 할 두 번째 INNER JOIN없이

a.id b.id b.aid c.id c.bid 
1  11  1  21  11 
2  12  2  22  12 

, 예상대로 :

a.id b.id b.aid 
1  11  1 
2  12  2 
3  null null 

은의 오라클 및 MS SQL 서버 간의 조인 다른 정의가있는 것 같습니다 . (잘못된 결과)

예상되는 결과를 얻기 위해 쿼리를 작성하는 방법을 알 수 없습니다.

귀하의 쿼리를 다음과 같이 해석됩니다
+1

내부에서 어떤 차이가 나는 것입니다 SQL 서버와 오라클 – edc65

+4

사이에 가입 왼쪽 :

당신은 B 사이에 조인 외부 조인을 사용해야와 C뿐만 아니라 SQL Server가 다른 것을 반환하면. –

+1

(두 번째) 내부 조이는 b.id에 null 값을 결합 할 수 없습니다. 따라서 expection이 올바르지 않은 것처럼 보입니다. oracle과 ms sql은 같은 방식으로 작동합니다 .for join – scaisEdge

답변

3

이 정확히 같은를 반환 할 올바른 행동과 SQL 서버입니다 결과. 아래 온라인 예제를 참조하십시오. http://rextester.com/EEGBZ41105

b와 c 사이에 내부 조인을 수행하기 때문에 a와 b 사이의 외부 조인이 본질적으로 무효화됩니다.

당신이 예상되는 출력의 마지막 행을 보면 :

a.id b.id b.aid c.id c.bid 
3  null null null null 

그리고 지금 조인 조건 b.id = c.bid 볼이 때문에에 b.id의 값이 null이기 때문에 해당 행을 제거하는 것이 매우 분명하다 a와 b 사이의 외부 조인. 그러면 내부 조인은 해당 행을 다시 제거합니다. ** 놀랄 매우 **이

SELECT * 
FROM a 
    LEFT JOIN b ON a.id = b.aid 
    LEFT JOIN c ON b.id = c.bid 
; 
+0

* 부끄러운 줄 알았어 * :) 고마워, 그거야! – pid

+0

성실히하기 위해, 전에 ANSI_NULLS가 작동했는지 모르겠다. 그들은 또한 ACCESS의 VB.NET 사이펀 데이터를 DB에 사용했습니다. 따라서 NULL을 알지 못하고 'NULL = NULL'이 된 세상에서 나는 수년 동안 살았을 가능성이 있습니다 (univ에서 나는 'NULL'이 다른 것과 동일하지 않다는 것을 잘 배웠습니다). – pid

+0

@pid : 그 부분을 삭제했습니다. 'ansi_nulls'가 off로 설정된 경우에도 나는 다른 결과를 얻지 못합니다. –

1

(주 괄호) : 대신에, 당신은 아마 의미

SELECT * 
FROM 
    (
    a 
    LEFT JOIN 
    b 
    ON a.id = b.aid 
    ) 
    INNER JOIN c 
    ON b.id = c.bid 

:

SELECT * 
FROM 
    a 
    LEFT JOIN 
    (
    b 
    INNER JOIN c 
    ON b.id = c.bid 
    ) 
    ON a.id = b.aid 
+0

네, 그게 제가 의도 한 것입니다.감사합니다, 다른 대답은 결과를 얻는 방법을 보여줍니다! – pid