[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.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.일반 조인을 위해, 그것은하지 않습니다. TableA의은 (당신의 C와 D의 예는 같은 것 때문에) TableB의이 TableA의 참여로 TableB의이 같은 실행 계획을 생성 할 것이다 가입
일반 조인을 위해, 그것은하지 않습니다. TableA의은 (당신의 C와 D의 예는 같은 것 때문에) TableB의이 TableA의 참여로 TableB의이 같은 실행 계획을 생성 할 것이다 가입
왼쪽에 대한 권리는 않습니다 합류했다. TableA의 표가 표는 TableB의 잘 TableA의 참여보다 TableA의 참여 왼쪽,하지만 그 같은보다 다른 가입 왼쪽
-
==============================
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.내부 조인을위한 오라클 최적화이 선택하는 테이블의 조인 순서. 최적화는 만 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. U는 자신의 웹 사이트에있는 Oracle 설명서를 확인할 수 있습니다. 그리고 왼쪽을 위해, 오른쪽 외부는 대답을 투표를 가장 잘 조인. 최적화는 최적의 순서와 각 테이블의 최적의 인덱스 가입 선택한다. 인덱스에 영향을 줄 수 있습니다 조인 순서는 최고의 선택입니다. 그것은 내부 테이블이라면 옵티마이 저는 테이블의 액세스 경로로서 인덱스를 선택할 수 있지만, 외부 테이블은 그렇지 않으면 (더 이상의 자격이 없다).
내부 조인을위한 오라클 최적화이 선택하는 테이블의 조인 순서. 최적화는 만 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. U는 자신의 웹 사이트에있는 Oracle 설명서를 확인할 수 있습니다. 그리고 왼쪽을 위해, 오른쪽 외부는 대답을 투표를 가장 잘 조인. 최적화는 최적의 순서와 각 테이블의 최적의 인덱스 가입 선택한다. 인덱스에 영향을 줄 수 있습니다 조인 순서는 최고의 선택입니다. 그것은 내부 테이블이라면 옵티마이 저는 테이블의 액세스 경로로서 인덱스를 선택할 수 있지만, 외부 테이블은 그렇지 않으면 (더 이상의 자격이 없다).
옵티마이 저는는 FROM 절 간단한에서 테이블의 조인 순서를 선택합니다. 대부분은 그렇게 옵티마이 저는 조인 순서를 자신의 선택, 조인 간단한에 평평하게하는 키워드 가입하여 결합한다.
최적화는 외부 조인에 대한 조인 순서를 선택하지 않는다; 그것은 문에 지정된 순서를 사용합니다.
A는 조인 순서를 선택하는 경우, 최적화 알고리즘은 고려 : 각 테이블의 크기 각 테이블에서 사용할 수있는 인덱스 테이블에 인덱스가 특히 유용 여부 조인 순서 행과 페이지의 수는 각 각 테이블에 대해 스캔하기 위해 가입
from https://stackoverflow.com/questions/9614922/does-the-join-order-matter-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SELECT와 INSERT (0) | 2020.03.17 |
---|---|
[SQL] 어떻게 비슷한 결과 및 종류의 유사성을 찾는 방법은? (0) | 2020.03.17 |
[SQL] SQL 서버 - INSERT 후 반환 값 (0) | 2020.03.17 |
[SQL] SQL을 사용 orm 또는 일반? [닫은] (0) | 2020.03.17 |
[SQL] 행에서 쉼표로 구분 된 문자열을 얻을 [중복] (0) | 2020.03.17 |