join 테이블 - 조인 순서가 SQL에서 중요합니까?




서브 드라이빙 (4)

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

당신의 질의는 실패 할 것이므로이 경우에 질서가 중요합니다.

성능을 무시한 경우 아래 질문 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>  

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

왼쪽 및 오른쪽 조인의 경우 해당됩니다. TableA left Join TableBTableB left Join TableA 와 다르지만 TableB right Join TableA 와 같음


INNER 조인의 경우, 순서는 중요하지 않습니다. 선택 사항을 SELECT * SELECT a.*, b.*, c.* 변경하면 쿼리는 동일한 결과를 반환합니다.

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

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

외부 조인은 연관성이 없으므로, 예에서 commutativity 및 associativity 속성을 모두 포함합니다.

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_idc.bc_id = b.bc_id 는 모두 동등성 검사이며 NULL 비교를 필요로하지 않습니다.

ON ax <= bx 또는 ON ax = 7 또는 ON ax LIKE bx 또는 ON (ax, ay) = (bx, by) 와 같은 다른 연산자와 조건을 가질 수도 있습니다. 두 쿼리는 여전히 동일합니다 .

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


필자의 경우에는 Ids 행이 있었고 char로 캐스팅하는 것이 필요했다. 그렇지 않으면 결과가 바이너리 형식으로 인코딩되었다.

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table




sql join relational-database