1. CROSS JOIN
논리적으로 봤을 때 크로스 조인은 조인들 중에서 가장 단순한 형태이다.
크로스 조인은 카티전 곱(Cartesian Product) 이라는 하나의 논리적 쿼리 프로세싱 단계만 처리한다.
이 단계에서는 조인을 하기 위해 입력값으로 지정된 두 개의 테이블에 대해
연산을 해서 두 테이블 간의 카티전 곱 결과를 만들어낸다.
즉 하나의 입력 테이블에 있는 각 행은 다른 테이블의 각 행과 매칭된다.
따라서 하나의 테이블에 m개가 있고 다른 테이블에는 n개의 행이 있다면,
결과로는 m x n 개의 행이 만들어진다.
CREATE TABLE dbo.TB_CUST(
cust_no INT NOT NULL,
cust_name NVARCHAR(100) NOT NULL
CONSTRAINT PK_TB_CUST PRIMARY KEY(cust_no)
);
-- 7개의 데이터를 INSERT
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(1, 'MIKE');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(2, 'OBAMA');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(3, 'TRUMP');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(4, 'MESSI');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(5, 'RONALDO');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(6, 'MALDINI');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(7, 'SANCHEZ');
CREATE TABLE dbo.TB_ORDER(
order_no INT NOT NULL,
cust_no INT NOT NULL,
product_no INT NOT NULL
CONSTRAINT PK_TB_ORDER PRIMARY KEY(ORDER_NO)
);
--6개의 데이터를 INSERT
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201901, 1, 701);
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201902, 1, 702);
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201904, 2, 704);
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201905, 3, 701);
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201906, 4, 703);
INSERT INTO TB_ORDER(order_no, cust_no, product_no) VALUES(201907, 5, 701);
-- 크로스 조인 결과 : 7 x 6 = 42 개가 나올것
SELECT * FROM dbo.TB_CUST WITH(NOLOCK)
CROSS JOIN dbo.TB_ORDER WITH(NOLOCK)
SQL Server 에서는 크로스 조인과 관련해서 두 개의 표준 문법을 제공하고 있다.
하나는 ANSI SQL-92 문법이며, 다른 하나는 ANSI SQL-89 문법이다.
(권장은 ANSI SQL-92 문법)
1) ANSI SQL-92 문법
-- ANSI SQL-92 문법
SELECT * FROM dbo.TB_CUST WITH(NOLOCK)
CROSS JOIN dbo.TB_ORDER WITH(NOLOCK)
2) ANSI SQL-89 문법
-- ANSI SQL-89 문법
SELECT * FROM
dbo.TB_CUST WITH(NOLOCK), dbo.TB_ORDER WITH(NOLOCK)
ANSI SQL-92문법과 ANSI SQL-89 문법은 문법형태만 다르고
논리적인 방식과 성능적인 차이는 전혀 없다.
2. SELF CROSS JOIN
동일 테이블에 대해 여러번 조인을 수행할 수도 있다.
이러한 방식을 셀프조인(SELF JOIN)이라고 하며,
모든 기본적인 조인 유형(크로스 조인, 내부 조인, 외부 조인)에서 지원된다.
셀프조인에서는 테이블에 별칭을 반드시 지정해 주어야 한다.
테이블 별칭이 없다면, 조인의 결과에 나오는 모든 컬럼은 명확해지지 않기 때문이다.
CREATE TABLE dbo.TB_CUST(
cust_no INT NOT NULL,
cust_name NVARCHAR(100) NOT NULL
CONSTRAINT PK__TB_CUST__CUST_NO PRIMARY KEY(cust_no)
);
-- 7개의 데이터를 INSERT
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(1, 'MIKE');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(2, 'OBAMA');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(3, 'TRUMP');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(4, 'MESSI');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(5, 'RONALDO');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(6, 'MALDINI');
INSERT INTO TB_CUST(cust_no, cust_name) VALUES(7, 'SANCHEZ');
- 7 X 7 = 49 개의 튜플이 나오게 될것이다.
SELECT
c1.cust_no, c1.cust_name
,c2.cust_no, c2.cust_name
FROM dbo.TB_CUST AS c1 WITH(NOLOCK)
CROSS JOIN dbo.TB_CUST AS c2 WITH(NOLOCK)
3. CROSS JOIN 응용 - 숫자를 출력하는 테이블
크로스 조인 방식이 아주 편리한 경우는 순서대로 나열되는 정수 결과를 출력해야 할 때다.
이러한 형태의 순차적인 숫자 집합은 여러 곳에서 사용될 수 있는 아주 강력한 도구다.
크로스 조인을 이용하면 효율적인 방법으로 순차적인 정수 집합을 만들 수 있다.
우선 digit 이라는 컬럼을 가지는 DIGITS라는 테이블을 만들어보자.
그런 다음, 이 테이블에 0~9 까지의 10개의 행을 입력한다.
CREATE TABLE dbo.DIGITS
(
digit INT NOT NULL PRIMARY KEY
)
INSERT INTO dbo.DIGITS VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
1부터 1,000까지의 순차적인 정수를 출력하는 쿼리를 작성해야 한다고 가정해보자.
Digits 테이블을 세 번 이용하면 결과를 쉽게 만들 수 있다.
SELECT d1.digit*100 + d2.digit*10 + d3.digit + 1 as digitsum
FROM dbo.DIGITS d1
CROSS JOIN dbo.DIGITS d2
CROSS JOIN dbo.DIGITS d3
order by digitsum
위의 로직은 for문과 같은 형태로 생각하면 된다.
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
cout << 100 * i + 10 * j + k + 1<< "\n";
}
}
}
return 0;
}
'SQL Basic' 카테고리의 다른 글
[MSSQL] OUTER JOIN (0) | 2022.05.14 |
---|---|
[MSSQL] INNER JOIN (0) | 2022.05.13 |
[MSSQL] JOIN (0) | 2022.05.11 |
SQL 이란? (0) | 2022.03.23 |
[MSSQL] STRING_SPLIT 함수 (0) | 2022.01.23 |