[SQL] 카테시안 곱(Cartesian Product)이란?
카테시안 곱(Cartesian Product)이란?
=> union(교집합)/ interction(합집합)
- From절에 2개 이상의 Table이 있을때 두 Table 사이에 유효 join 조건을 적지 않았을때 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것이다.
쿼리본문제공
CREATE TABLE COMP (
COMP_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
COMP_NM VARCHAR(200) NULL COLLATE 'utf8_general_ci',
COMP_ADDR VARCHAR(300) NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (COMP_ID)
)
;
CREATE TABLE FACTORY (
COMP_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
FACTO_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
FACTO_NM VARCHAR(200) NULL COLLATE 'utf8_general_ci',
FACTO_ADDR VARCHAR(300) NULL COLLATE 'utf8_general_ci',
FACTO_TEL VARCHAR(40) NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (FACTO_ID, COMP_ID)
)
;
CREATE TABLE BUILDING (
COMP_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
FACTO_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
BUILD_ID VARCHAR(10) NOT NULL COLLATE 'utf8_general_ci',
BUILD_TEL VARCHAR(40) NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (COMP_ID, FACTO_ID, BUILD_ID)
)
;
INSERT INTO comp (
COMP_ID,
COMP_NM,
COMP_ADDR
) VALUES (
'AAA',
'회사AAAA',
'구파발'
);
INSERT INTO comp (
COMP_ID,
COMP_NM,
COMP_ADDR
) VALUES (
'BBB',
'회사BBBB',
'노량진'
);
INSERT INTO comp (
COMP_ID,
COMP_NM,
COMP_ADDR
) VALUES (
'CCC',
'회사CCCC',
'영등포'
);
--FACTORY에 삽입하기
"AAA" "A1" "공장1" "신촌" \N
"AAA" "B1" "공장2" "혜화" \N
"BBB" "C1" "공장3" "청담" \N
TABLE COMP
COMP_ID | COMP_NM | COMP_ADDR | |
1 | AAA | 회사AAAA | 구파발 |
2 | BBB | 회사BBB | 노량진 |
3 | CCC | 회사CCCC' | 영등포 |
TABLE FACTORY
COMP_ID | FACTO_ID | FACTO_NM | FACTO_ADDR | FACTO_TEL | |
1 | AAA | A1 | 공장1 | 신촌 | \N |
2 | AAA | B1 | 공장2 | 혜화 | \N |
3 | BBB | C1' | 공장3 | 청담 | \N |
=> 3 X 3 = 9개의 결과 출력
SELECT *
FROM comp A LEFT OUTER JOIN
factory B ON 1 = 1
;
위 커리 실행시 =>
"AAA" "회사AAAA" "구파발" "AAA" "A1" "공장1" "신촌" \N
"BBB" "회사BBBB" "노량진" "AAA" "A1" "공장1" "신촌" \N
"CCC" "회사CCCC" "영등포" "AAA" "A1" "공장1" "신촌" \N
"AAA" "회사AAAA" "구파발" "AAA" "B1" "공장2" "혜화" \N
"BBB" "회사BBBB" "노량진" "AAA" "B1" "공장2" "혜화" \N
"CCC" "회사CCCC" "영등포" "AAA" "B1" "공장2" "혜화" \N
"AAA" "회사AAAA" "구파발" "BBB" "C1" "공장3" "청담" \N
"BBB" "회사BBBB" "노량진" "BBB" "C1" "공장3" "청담" \N
"CCC" "회사CCCC" "영등포" "BBB" "C1" "공장3" "청담" \N
=>위의 같은경우 카테시안 곱 현상이 발생한다.
- 즉, 카테시안 곱은 join 쿼리 중에 WHERE 절에 기술하는 join 조건이 잘못 기술되었거나 아예 없을 경우 발생하는 현상입니다.
출처: