복붙노트

[SQL] 는 SQL에서 위해 물질을 결합 하는가?

SQL

는 SQL에서 위해 물질을 결합 하는가?

무시하고 성능, 나는 아래 쿼리 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>  

해결법

  1. ==============================

    1.INNER 조인의 경우, 순서는 중요하지 않습니다. 쿼리가 한 선택에서 선택을 변경하면, 같은 결과를 반환합니다 *는을 선택합니다. *, B을. *, C를. *.

    INNER 조인의 경우, 순서는 중요하지 않습니다. 쿼리가 한 선택에서 선택을 변경하면, 같은 결과를 반환합니다 *는을 선택합니다. *, B을. *, C를. *.

    및 (업데이트) 것들을 훨씬 더 복잡 - (LEFT, RIGHT 또는 FULL)의 경우 OUTER 네, 주문 사항, 조인.

    첫째, 외부 조인 왼쪽은 왼쪽 B B와 동일하지 JOIN 있도록 가환하지 조인

    외부 그래서 모두 (교환 법칙과 결합 성) 속성을 포함하여 예제에서, 중 연관되지 않은 조인

    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
    

    또 다른 (희망 간단) 연관성 예. LEFT JOIN는 C (좌측이 가입 B)로 생각할 :

    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
    

    이것은 (LEFT C가 가입 b)의 좌측에 가입하도록 동등하다 :

    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 "좋은"가 있기 때문이다. b.ab_id = a.ab_id 및 c.bc_id = b.bc_id ON 모두 평등 체크하고 NULL 비교를 포함하지 않습니다.

    당신은 다른 사업자 또는 더 복잡한 사람과 조건을 가질 수 있습니다 같은 : 도끼 ON <= BX 또는 ON 도끼 = 7 또는 BX 또는 ON (AX, AY) = (BX에 의해)과 두 개의 질의 등에는 도끼가 여전히 동등한 것 .

    그러나 경우 COALESCE (같은 널 관련된 IS NULL이 참여 또는 기능) 중 어느 하나, 예를 들면 조건 b.ab_id 다음 두 쿼리 동등하지 않을, IS NULL 인 경우.

  2. ==============================

    2.일반 조인을 위해, 그것은하지 않습니다. TableA의은 (당신의 C와 D의 예는 같은 것 때문에) TableB의이 TableA의 참여로 TableB의이 같은 실행 계획을 생성 할 것이다 가입

    일반 조인을 위해, 그것은하지 않습니다. TableA의은 (당신의 C와 D의 예는 같은 것 때문에) TableB의이 TableA의 참여로 TableB의이 같은 실행 계획을 생성 할 것이다 가입

    왼쪽에 대한 권리는 않습니다 합류했다. TableA의 표가 표는 TableB의 잘 TableA의 참여보다 TableA의 참여 왼쪽,하지만 그 같은보다 다른 가입 왼쪽

  3. ==============================

    3.당신은 즉, B를 결합하기 전에 B에서 필드에 C를 결합하려고하는 경우 :

    당신은 즉, 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
    

    쿼리는 이렇게 순서가 중요한이 경우, 실패합니다.

  4. ==============================

    4.내부 조인을위한 오라클 최적화이 선택하는 테이블의 조인 순서. 최적화는 만 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. U는 자신의 웹 사이트에있는 Oracle 설명서를 확인할 수 있습니다. 그리고 왼쪽을 위해, 오른쪽 외부는 대답을 투표를 가장 잘 조인. 최적화는 최적의 순서와 각 테이블의 최적의 인덱스 가입 선택한다. 인덱스에 영향을 줄 수 있습니다 조인 순서는 최고의 선택입니다. 그것은 내부 테이블이라면 옵티마이 저는 테이블의 액세스 경로로서 인덱스를 선택할 수 있지만, 외부 테이블은 그렇지 않으면 (더 이상의 자격이 없다).

    내부 조인을위한 오라클 최적화이 선택하는 테이블의 조인 순서. 최적화는 만 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. U는 자신의 웹 사이트에있는 Oracle 설명서를 확인할 수 있습니다. 그리고 왼쪽을 위해, 오른쪽 외부는 대답을 투표를 가장 잘 조인. 최적화는 최적의 순서와 각 테이블의 최적의 인덱스 가입 선택한다. 인덱스에 영향을 줄 수 있습니다 조인 순서는 최고의 선택입니다. 그것은 내부 테이블이라면 옵티마이 저는 테이블의 액세스 경로로서 인덱스를 선택할 수 있지만, 외부 테이블은 그렇지 않으면 (더 이상의 자격이 없다).

    옵티마이 저는는 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. 대부분은 그렇게 옵티마이 저는 조인 순서를 자신의 선택, 조인 간단한에 평평하게하는 키워드 가입하여 결합한다.

    최적화는 외부 조인에 대한 조인 순서를 선택하지 않는다; 그것은 문에 지정된 순서를 사용합니다.

    A는 조인 순서를 선택하는 경우, 최적화 알고리즘은 고려 : 각 테이블의 크기 각 테이블에서 사용할 수있는 인덱스 테이블에 인덱스가 특히 유용 여부 조인 순서 행과 페이지의 수는 각 각 테이블에 대해 스캔하기 위해 가입

  5. from https://stackoverflow.com/questions/9614922/does-the-join-order-matter-in-sql by cc-by-sa and MIT license