2012-03-08 2 views
125

성능을 무시하고 아래 쿼리 A 및 B와 동일한 결과가 나올까요? C와 D는 어때?조인 순서가 SQL에서 중요합니까?

-- A 
select * 
from a left join b 
      on <blahblah> 
     left join c 
      on <blahblan> 


-- B 
select * 
from a left join c 
      on <blahblah> 
     left join b 
      on <blahblan> 

-- C 
select * 
from a join b 
      on <blahblah> 
     join c 
      on <blahblan> 


-- D 
select * 
from a join c 
      on <blahblah> 
     join b 
      on <blahblan> 
+5

무엇이 ''입니까? A와 B, A와 C를 합치고 있습니까? 아니면 A와 B, B와 C를 합치십니까? – beny23

+1

안녕하세요 Beny, 내 질문에 코드는 추상화입니다. 나는 A와 B 또는 A와 C를 합치는 것에 관심이 없다. 단지 같은 구문을 사용하여 동일한 결과를 얻을 수 있는지 알고 싶다. –

답변

156

INNER의 경우, 순서는 중요하지 않습니다. 선택 항목을 SELECT *에서 SELECT a.*, b.*, c.*으로 변경하면 쿼리는 동일한 결과를 반환합니다. 및 (업데이트) 것들을 훨씬 더 복잡하다 - (LEFT, RIGHT 또는 FULL) OUTER를 들어


네, 주문 사항이 합류했다.

a LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    LEFT JOIN c 
    ON c.ac_id = a.ac_id 
:

먼저

, 외부 조인은 너무 a LEFT JOIN b는 (교환 법칙과 연관성)을 모두 포함하여 예제 특성 때문에, 연관없는 두 b LEFT JOIN a

외부 조인과 동일하지 않습니다, 교환 법칙이 성립하지 않습니다

는 동등하다 :

a LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    LEFT JOIN b 
    ON b.ab_id = a.ab_id 

하지만 :

a LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    AND c.bc_id = b.bc_id 

는 동등하지 않다 :

a LEFT JOIN c 
    ON c.ac_id = a.ac_id 
    LEFT JOIN b 
    ON b.ab_id = a.ab_id 
    AND b.bc_id = c.bc_id 

다른 (희망 단순한) 연관성 예. (a LEFT JOIN b) LEFT JOIN c으로이 생각해

a LEFT JOIN b 
    ON b.ab_id = a.ab_id   -- AB condition 
LEFT JOIN c 
    ON c.bc_id = b.bc_id   -- BC condition 

a LEFT JOIN (b LEFT JOIN c)에 해당합니다 :

a LEFT JOIN 
    b LEFT JOIN c 
     ON c.bc_id = b.bc_id   -- BC condition 
    ON b.ab_id = a.ab_id   -- AB condition 

을 우리가 "좋은"ON 조건이 때문. ON b.ab_id = a.ab_idc.bc_id = b.bc_id은 모두 동등 확인이며 NULL 비교를 포함하지 않습니다.

당신도 다른 사업자 또는 같은 더 복잡한 사람과 조건을 가질 수 있습니다 ON a.x <= b.x 또는 ON a.x = 7 또는 ON a.x LIKE b.x 또는 ON (a.x, a.y) = (b.x, b.y) 두 쿼리는 여전히 상당 할 것이다.

그러나 IS NULL 또는 COALESCE()과 같이 null과 관련된 함수가있는 경우 (예 : 조건이 b.ab_id IS NULL 인 경우) 두 쿼리가 동일하지 않습니다.

+2

더 정확하게 말하면, 바깥 쪽 조인은 한 테이블의 모든 열이 NULL 인 행에서 조건부를 만족할 수없는 한 연관성이 있다고 말하면됩니다. 단, 조건부가 IS NULL을 포함하지 않는 한 연관성이 있다고 말할 수 있습니다 또는 '널 (null)과 관련된 함수'일 수 있습니다. 'a.somecol> 0 OR b.someothercol> 0'처럼 이전 설명을 만족하지만 후자는 만족하지 않는 술어를 쉽게 상상할 수 있습니다. 연관성은 그 상태에서 실패 할 수 있습니다. –

+0

하지만 그래, 나는 술어가 내가 여기서 설명하는 조건 중 하나를 만족시키지 않는 한 OUTER JOIN이 연관 적이라고 말하는 것이 기술적으로 사실이라고 생각한다. http://stackoverflow.com/questions/20022196/are-left- outer-joins-associative/20022925 # 20022925 (처음에는 INNER JOIN에 대한 결합 성도 없지만 언급할만한 가치가 없으므로 값 싸고 분명한 접근법입니다.) 일반적인 종류의 JOIN - 외래 키에 조인 - 이러한 조건 중 하나를 만족시키지 않아 좋고 연관성이 있습니다. –

+0

@ MarkAmery 고마워, 그 시점에서 내 문장을 구조화하는 데 어려움을 겪고 있었다. (그리고 나는 너의 대답을 이미 upvoted했다.) –

4

일반 조인의 경우 그렇지 않습니다. TableA join TableBTableB join TableA과 동일한 실행 계획을 생성합니다 (따라서 C 및 D 예제는 동일합니다)

왼쪽 및 오른쪽 조인의 경우.TableA left Join TableBTableB left Join TableA과 다르지만 같음 TableB right Join TableA

+2

이것은 commutativity 만 다루지 만, 질문의 예는 묻는 사람이 연관성에 관심이 있음을 보여줍니다. ypercube의 대답은 둘 다 다룹니다. –

관련 문제