2012-08-30 2 views
10

나는이 문제에 대한 답변을 찾기가 힘들었지 만 ... 누군가가 나에게 퍼팅의 차이점을 설명 할 수 있습니까? JOIN 자체의 ON 조건과 다른 JOIN의 끝 부분을 ON으로 설정합니다.SQL에서, 다음과 같은 ON 조건과 Join 조건의 차이점은 무엇입니까?

여기이 두 SELECT 문 다른 결과를 왜 이해가 안 예를 들어 http://sqlfiddle.com/#!3/e0a0f/3

CREATE TABLE TableA (Email VARCHAR(100), SomeNameA VARCHAR(100)) 
CREATE TABLE Tableb (Email VARCHAR(100), SomeNameB VARCHAR(100)) 
CREATE TABLE Tablec (Email VARCHAR(100), SomeNameC VARCHAR(100)) 

INSERT INTO TableA SELECT '[email protected]', 'JoeA' 
INSERT INTO TableA SELECT '[email protected]', 'JaneA' 
INSERT INTO TableA SELECT '[email protected]', 'DaveA' 
INSERT INTO TableB SELECT '[email protected]', 'JoeB' 
INSERT INTO TableB SELECT '[email protected]', 'DaveB' 
INSERT INTO TableC SELECT '[email protected]', 'JoeC' 
INSERT INTO TableC SELECT '[email protected]', 'DaveC' 


SELECT TOP 2 a.*, 
      b.*, 
      c.* 
FROM TableA a 
     LEFT OUTER JOIN TableB b 
        ON a.email = b.email 
     INNER JOIN TableC c 
        ON c.Email = b.email; 

SELECT TOP 2 a.*, 
      b.*, 
      c.* 
FROM TableA a 
     LEFT OUTER JOIN TableB b 
     INNER JOIN TableC c 
        ON c.Email = b.email 
        ON a.email = b.email; 

입니다.

답변

12

중요한 것은 조인 순서입니다. 모든 조인이 임시 "가상"테이블을 생성 한 것처럼 표현을 처리하십시오.

그래서 다음과 같이 순서는 다음

FROM TableA a 
LEFT OUTER JOIN TableB b ON a.email = b.email 
INNER JOIN TableC c ON c.Email = b.email ; 

을 쓸 때 :

  1. TableAV1
  2. V1TableC에 내부에 가입되어 일시적 관계를 생산 TableB에 가입 남아 있습니다.

는 Meanhwile 당신은 쓸 때 다음과 같이

FROM TableA a 
LEFT OUTER JOIN TableB b 
INNER JOIN TableC c ON c.Email = b.email ON a.email = b.email; 

다음 순서는 다음과 같습니다

  1. TableB 임시 관계 V1을 생산 TableC에 합류 내부입니다.
  2. TableAV1에 합류 한 채로 남아 있습니다.

따라서 결과가 다릅니다.이러한 상황에서 괄호를 사용하여 쿼리의 가독성을 높이는 것이 좋습니다.

FROM TableA a 
LEFT OUTER JOIN 
    (TableB b INNER JOIN TableC c ON c.Email = b.email) 
ON a.email = b.email; 
+0

이 설명에 대한 건배 – MakkyNZ

4

두 번째 예에서 부품 ON a.email = b.emailLEFT JOIN에 속합니다.
다음과 같이 작성하면 , 그것은 의미 다음

INNER JOIN TableC TableB의와 LEFT OUTER JOIN TableA의와 결과

.

결과는 TableA의 모든 행과 TableB의 행이 결합되어 TableC에도 항목이 있습니다. TableA의

LEFT OUTER JOIN TableB의 상기 결과 INNER JOIN TableC :

첫번째 예는 다음을 의미한다. 이는 TableB에 INNER JOIN을 사용하는 것과 같습니다.
설명 : TableB가있는 LEFT OUTER JOIN TableA를 사용하면 TableA의 모든 행을 가져오고 TableB의 행을 일치 시키면 해당 데이터도 받게됩니다. 결과 집합에 b.email = NULL 행이 있고 이제 TableC로 INNER JOIN이됩니다. TableC에 email = NULL과 같은 항목이없는 한 관찰 한 결과를 얻을 수 있습니다.

관련 문제