SQL Server : CROSS JOIN과 FULL OUTER JOIN의 차이점은 무엇입니까?


답변:


243

교차 조인은 두 테이블간에 직교 곱을 만들어 모든 행의 가능한 모든 조합을 반환합니다. on모든 것을 모든 것에 합류시키기 때문에 절이 없습니다 .

A full outer join는 a left outerright outerjoin 의 조합입니다 . 쿼리의 where절 과 일치하는 두 테이블의 모든 행을 반환하며 해당 행에 대한 on조건을 만족할 수없는 null경우 채워지지 않은 필드 에 값을 넣습니다 .

위키 백과 기사는 샘플 테이블 세트가 제공된 출력 예제와 함께 다양한 유형의 조인에 대해 설명합니다.


그렇다면 큰 테이블의 FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id 경우 항상 FROM t1,t2 WHERE t1.id=t2.id? 보다 빠릅니다 .
alexkovelsky

@alexkovelsky 내부 조인은 인덱스를 사용하면 테이블 중 하나의 모든 행을 읽지 않아도되므로 두 테이블 사이에 일치하는 항목이 거의 없을 때 종종 빠릅니다. 완전 외부 조인은 항상 두 테이블 (또는 관련 인덱스)의 모든 행을 읽어야합니다. 인덱스가 충분하지 않거나 필요한 열을 출력하기 위해 기본 힙을 읽어야하는 경우 전체 외부 조인은 거의 항상 내부 조인보다 느립니다.
Andrew Hill

1
outer join빠르거나 cross join?
Shafizadeh

2
@Shafizadeh-그들은 다른 일을합니다.
Donnie

9
True로 외부 가입을하면 어떻게 되나요? 결과 / 성능이 CROSS JOIN과 유사합니까?
architectonic

65

빈 테이블 (또는 결과 집합)과의 크로스 조인은 빈 테이블 (M x N; 따라서 M x 0 = 0)이됩니다.

전체 외부 조인에는 M과 N이 모두 0이 아닌 한 항상 행이 있습니다.


32

하나의 중요한 측면을 다른 답변에 추가하고 싶습니다. 실제로이 주제를 가장 좋은 방법으로 설명했습니다.

2 개의 조인 된 테이블에 M 및 N 개의 행이 포함 된 경우 교차 조인은 항상 (M x N) 행을 생성하지만 완전 외부 조인은 MAX (M, N)에서 (M + N) 행을 생성합니다 (실제로 행 수에 따라 다름) "on"술어와 일치).

편집하다:

논리적 쿼리 처리 관점에서 CROSS JOIN은 실제로 항상 M x N 행을 생성합니다. FULL OUTER JOIN에서 발생하는 일은 왼쪽 및 오른쪽 조인이 모두 발생한 것처럼 왼쪽 및 오른쪽 테이블이 모두 "보존"된다는 것입니다. 따라서 왼쪽 및 오른쪽 테이블의 ON 술어를 만족시키지 않는 행이 결과 세트에 추가됩니다.


2
그 경계는 가능한 1 대 다수의 경기를 제외하고 있습니까? 완전 외부 조인은 여전히 ​​(M x N) 행을 생성 할 수 있습니다.
maxwellb

1
트래픽 t CROSS JOIN 수신자 r에서 COUNT_BIG (*)를 선택하고 트래픽 t FULL JOIN 수신자 r에서 COUNT_BIG (*)를 선택하십시오 (1 = 1).
urlreader

2
당신의 가장 좋은 답변입니다. 기본적으로 : cross join배수는 테이블입니다. A는 full outer join... 일치하는 행 수에 따라 최악의 경우 추가합니다
브라이언 피터슨

예 .. MAX (M, N)에서 (M + N) 행 까지이 수학을 찾고있었습니다 . 감사합니다.
Arup Rakshit

1
이것은 잘못이다. FULL JOIN ON 행은 INNER JOIN ON 행 UNION ALL 일치하지 않는 왼쪽 테이블 행 널 확장 UNION ALL 일치하지 않는 오른쪽 테이블 행이 널 확장되었습니다. 따라서 FULL JOIN은 M * N 행을 반환 할 수 있습니다. 아마도 MAX (M, N) 및 M + N보다 큽니다. 그러나 어쨌든 M & N의 함수로 반환되는 최소 및 최대 행 수는 유용하지 않습니다 . 유용한 것은 INNER JOIN ON 및 일치하지 않는 행 측면에서 FULL JOIN ON명확한 정의입니다 .
philipxy

15

교차 조인 : 교차 조인은 두 개 이상의 테이블에서 모든 행 조합으로 구성된 결과를 생성합니다. 즉, 테이블 A에 3 개의 행이 있고 테이블 B에 2 개의 행이 있으면 CROSS JOIN이 6 개의 행을 생성합니다. 두 테이블 간에는 관계가 없습니다. 문자 그대로 가능한 모든 조합을 생성하면됩니다.

완전 외부 조인 : 전체 외부 조인은 "왼쪽"도 "오른쪽"도 아닙니다. 둘 다입니다! JOIN에 참여하는 두 테이블 또는 결과 세트의 모든 행이 포함됩니다. JOIN의 "왼쪽"에있는 행에 대해 일치하는 행이 없으면 "오른쪽"에 결과 집합의 Null 값이 표시됩니다. 반대로 JOIN의 "오른쪽"행에 일치하는 행이 없으면 "왼쪽"의 결과 집합에 Null 값이 표시됩니다.


15

SQL Server의 CROSS JOIN and FULL OUTER JOIN경우 다릅니다. CROSS JOIN필터 기준 또는 조건에 관계없이 단순히 두 테이블의 직교 곱입니다.

FULL OUTER JOINLEFT OUTER JOIN and RIGHT OUTER JOIN두 테이블 의 고유 한 결과 집합을 제공합니다 . 또한 두 개의 테이블 열을 맵핑하려면 ON 절이 필요합니다.

표 1에는 10 개의 행이 있고 표 2에는 20 개의 행이 있으며 특정 열에 5 개의 행이 일치합니다.

그런 다음 CROSS JOIN결과 집합에 10 * 20 = 200 개의 행을 반환합니다.

FULL OUTER JOIN 결과 집합에 25 개의 행을 반환합니다.

FULL OUTER JOIN(또는 다른 JOIN)은 항상보다 작거나 같은 결과 집합을 반환합니다 Cartesian Product number.

행의 수에 의해 반환 FULL OUTER JOIN(의해 행 번호 동일 LEFT OUTER JOIN) + (의해 행 번호 RIGHT OUTER JOIN(행 번호에 의해 -) INNER JOIN).


8

반환 된 NULL 값을 제외하고는 동일한 개념입니다.

아래를보십시오 :

declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;

declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;

select
    t1.*,
    t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;

/* full outer join
col1        col2        col1        col2
----------- ----------- ----------- -----------
NULL        NULL        10          101
1           11          NULL        NULL
2           22          2           202
*/

select
    t1.*,
    t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;

/* cross join
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          2           202
1           11          10          101
2           22          2           202
2           22          10          101
*/

1
훌륭한 예입니다!
Lucas925

1
실제 데이터 예제에 감사드립니다. 더 명확 해집니다.
dtc


2

완전 외부 조인은 왼쪽 외부 조인과 오른쪽 외부 조인을 결합합니다. 결과 집합은 조건이 충족되는 두 테이블에서 행을 반환하지만 일치하지 않는 경우에는 null 열을 반환합니다.

교차 조인은 테이블을 조인하는 데 조건이 필요하지 않은 카티 전 곱 입니다. 결과 집합에는 두 테이블을 곱한 행과 열이 포함됩니다.


1

다음은 FULL OUTER JOIN과 CROSS JOIN이 모두 NULL을 반환하지 않고 동일한 결과 집합을 반환하는 예입니다. FULL OUTER JOIN에 대한 ON 절의 1 = 1에 유의하십시오.

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 행 영향을 받음)

(2 행 영향을 받음)
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10101
1 11 2 202
2 22 2 202
select  *
from    @table1 t1 cross join @table2 t2
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10101
1 11 2 202
2 22 2 202

(4 행 영향)

1

SQL 전체 외부 가입

  • FULL OUTER JOIN은 일치 여부에 관계없이 왼쪽 테이블 (table1)과 오른쪽 테이블 (table2)의 모든 행을 반환합니다.

  • FULL OUTER JOIN 키워드는 LEFT OUTER JOIN과 RIGHT OUTER JOIN의 결과를 결합합니다.

  • SQL 전체 외부 조인은 FULL JOIN이라고도합니다.

참조 : http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS 가입

  • SQL CROSS JOIN에서 첫 번째 테이블의 각 행은 두 번째 테이블의 각 행과 매핑됩니다.

  • CROSS JOIN 연산의 결과 집합으로 생성 된 행 수는 첫 번째 테이블의 행 수에 두 번째 테이블의 행 수를 곱한 값과 같습니다.

  • CROSS JOIN은 직교 곱 / 직교 조인이라고도합니다.

  • 테이블 A의 행 수는 m이고 테이블 B의 행 수는 n이며 결과 테이블은 m * n 행을 갖습니다.

참조 : http://datasciencemadesimple.com/sql-cross-join/

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