크리스의 개발일기

[SQL] 카테시안 곱(Cartesian Product)이란? 본문

Database/SQL

[SQL] 카테시안 곱(Cartesian Product)이란?

ChrisJang 2020. 11. 9. 17:34
반응형

카테시안 곱(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 조건이 잘못 기술되었거나 아예 없을 경우 발생하는 현상입니다.

 

 

출처:

gbs1995.tistory.com/59

rtti.tistory.com/entry/Static-SQL%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%AC%B4%EA%B8%B01-Cartesian-Product%EC%B9%B4%ED%85%8C%EC%8B%9C%EC%95%88-%EA%B3%B1

 

반응형
Comments