SQL에서 조인 순서가 중요합니까?


189

성능을 무시하면 아래 쿼리 A와 B에서 동일한 결과를 얻을 수 있습니까? C와 D는 어떻습니까?

-- 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>  

11
무엇입니까 <blahblah>? A-B 및 A-C에 합류합니까, 아니면 A-B 및 B-C에 합류합니까?
beny23

2
안녕 베니, 내 질문에 코드는 추상화입니다. 나는 A를 B에 또는 A를 C에 결합시키는 것에 관심이 없으며, 그와 같은 구문이 동일한 결과를 제공 할 것임을 알고 싶습니다.
단지 학습자

답변:


225

들어 INNER조인, 더, 순서는 중요하지 않습니다 않습니다. 선택 항목을에서 (으) SELECT *로 변경하는 한 쿼리는 동일한 결과를 반환 합니다 SELECT a.*, b.*, c.*.


( LEFT, RIGHT또는 FULL) OUTER조인의 경우 순서가 중요하며 업데이트 된 사항은 훨씬 복잡합니다.

첫째, 외부 조인은 교환 적이 지 a LEFT JOIN b않으므로 다음과 같습니다.b LEFT JOIN a

외부 조인도 연관성이 없으므로 예제에서 (정류 성과 연관성) 속성을 모두 포함합니다.

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

다음과 같습니다 .

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_id와 것은 c.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()예를 들어 조건이 b.ab_id IS NULL인 경우 와 같이 null과 관련된 함수 인 경우 두 쿼리는 동일하지 않습니다.


3
술어에 IS NULL이 없거나 'null과 관련된 함수'. 앞의 설명은 만족하지만, 후자는 그렇지 않은 술어를 쉽게 상상할 수있다 a.somecol > 0 OR b.someothercol > 0. 해당 조건에서 연관성이 실패 할 수 있습니다.
Mark Amery

그러나 예, 술어가 여기에 설명 된 조건 중 하나를 만족하지 않는 한 외부 조인이 연관성이 있다고 말하는 것은 기술적으로 사실이라고 생각합니다. stackoverflow.com/questions/20022196/… (첫 번째는 또한 연관성을 손상시킵니다) INNER JOIN의 경우에는 언급 할 가치가없는 값 싸고 명백한 접근 방식입니다.) 외래 키에 참여하는 가장 일반적인 JOIN 유형은 이러한 조건 중 하나를 만족하지 않는다는 점도 지적 할 가치가 있습니다. 따라서 훌륭하고 연관성이 있습니다.
Mark Amery

1
@MarkAmery 그 시점에 내 문장 내가 힘든 시간의 구조를 가지고 있었다, 감사 (그리고 나는 이미 upvoted 가지고 당신의 대답)
ypercubeᵀᴹ

ypercube 나는 INNER JOIN다음을 가지고 LEFT JOIN있습니다. 쿼리가 Filter먼저 레코드를 기반으로 INNER JOIN한 다음 레코드에 적용 LEFT JOIN되는 방식으로 작동 Filtered합니까?
무하마드 바바

사실, 모든 종류의 결합 입니다 SQL 표준에 의해 지정 및 연관성의 수학적 정의에 따라로서, 연관,하지만 그들은하지 않습니다 나타 괄호를 재 배열하면 이동이 필요하기 때문에 연관 ON절을 (즉, "사양 가입") 새로운 위치를 . 그러나 이것은 구문 일뿐입니다. 관계 대수 표기법 (결합 사양이 결합 연산자 아래에있는 경우)을 사용하면 연관성이보다 분명해집니다. 외부가 아닌 조인 당신의 인수는 디스플레이 교환 법칙이 성립 올바른 인
루카스 에더

4

일반 조인의 경우 그렇지 않습니다. TableA join TableB동일한 실행 계획을 생성 TableB join TableA하므로 (C 및 D 예제는 동일)

왼쪽 및 오른쪽 조인이 수행합니다. TableA left Join TableB과 다른 TableB left Join TableA,하지만 이외의 동일TableB right Join TableA


4
이것은 commutativity만을 다루지 만 질문의 예제는 asker가 연관성에 관심이 있음을 보여줍니다. ypercube의 답변은 둘 다 해결합니다.
Mark Amery

2

B에 가입하기 전에 B의 필드에서 C에 가입하려고 시도하는 경우 :

SELECT A.x, A.y, A.z FROM A 
   INNER JOIN C
       on B.x = C.x
   INNER JOIN b
       on A.x = B.x

쿼리가 실패하므로이 경우 순서가 중요합니다.


예, 맞습니다. 정답을 수정해야합니다.
Nir Pengas

-2

Oracle Optimizer 는 내부 조인을 위해 테이블의 조인 순서를 선택합니다. 옵티마이 저는 간단한 FROM 절에서만 테이블의 조인 순서를 선택합니다. U는 그들의 웹 사이트에서 오라클 문서를 확인할 수 있습니다. 그리고 왼쪽, 오른쪽 외부 조인에서 가장 투표 된 답변이 맞습니다. 옵티마이 저는 최적의 조인 순서와 각 테이블에 대한 최적의 인덱스를 선택합니다. 조인 순서는 어떤 인덱스가 최선의 선택인지에 영향을 줄 수 있습니다. 옵티마이 저는 테이블이 내부 테이블 인 경우 테이블에 대한 액세스 경로로 인덱스를 선택할 수 있지만 외부 테이블 인 경우에는 더 이상 자격 조건이없는 경우 인덱스를 선택할 수 없습니다.

옵티마이 저는 간단한 FROM 절에서만 테이블의 조인 순서를 선택합니다. JOIN 키워드를 사용하는 대부분의 조인은 단순 조인으로 병합되므로 옵티마이 저가 조인 순서를 선택합니다.

옵티마이 저는 외부 조인에 대한 조인 순서를 선택하지 않습니다. 명령문에 지정된 순서를 사용합니다.

조인 순서를 선택할 때 옵티마이 저는 다음을 고려합니다. 각 테이블의 크기 각 테이블에서 사용 가능한 인덱스 특정 조인 순서에서 테이블의 인덱스가 유용한 지 여부 각 테이블에서 스캔 할 행 및 페이지 수 주문에 가입

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.