[SQL] 모든 조합 만들기 - CROSS JOIN

2024. 10. 17. 17:14Language/SQL

 SQL 문제를 풀던 도중 두 테이블의 각 컬럼 값으로 만들 수 있는 모든 조합이 필요한 경우가 있었다. 해당 문제를 CROSS JOIN 을 활용해 해결하게 되면서 이렇게 기록하게 되었다.

 

1. 기본 문법

SELECT a.columName(s), b.columnName(s)
FROM tableA AS a CROSS JOIN tableB AS b

 

 게시글 제목이나 위에 작성한 내용만 보면 "조합을 어떻게 만든다는 거지?" 라는 생각이 든다. 정확하게 말하면 두 테이블 A, B 가 있다고 했을 때 A 의 각 행(레코드)에 B 의 각 행(레코드)를 모두 JOIN 하는 것이다. 그 후 SELECT 문에 작성한 내용을 통해 원하는 컬럼들을 결과 테이블에 추가해 반환하게 된다.

 

한 마디로 두 테이블의 각 행(레코드)으로 만들 수 있는 모든 조합에 대한 JOIN 을 수행한다고 할 수 있다. 그래서 두 테이블이 갖는 행의 개수에 따라 어마어마한 개수의 행을 가진 JOIN 결과를 마주할 수 있다. 그렇기에 사용에 유의해야 한다.

 

※ 참고 : 내가 참고한 문서에도 "CROSS JOIN 은 잠재적으로 매우 큰 결과 집합을 반환할 수 있습니다!" 라 경고하고 있다.

 

 

2. 사용 예제

 자칫 너무 큰 결과 집합을 반환될 수 있으므로 직접 테이블을 생성해 CROSS JOIN 을 사용해 보았다. 테이블 NUMS 에는 'num' 컬럼이 존재하고 각 행은 '1~4' 의 값을 갖는다. 테이블 NAMES 에는 'name' 컬럼이 존재하고 각 행은 임의의 이름(중복 X)을 갖는다. 이 때 'num' 과 'name' 으로 만들 수 있는 모든 조합을 레코드로 갖는 결과 테이블을 반환한다.

 

예제에 사용한 NUMS, NAMES 테이블은 아래의 이미지와 같다.

NUMS(왼), NAMES(오)

SELECT num, name
FROM nums CROSS JOIN names
ORDER BY 1

결과 테이블

 

결과 테이블을 확인해 보면 'num' 의 각 숫자마다 'name' 의 각 행이 JOIN 된 것을 확인할 수 있다. 'NUMS' 테이블의 각 행과 'NAMES' 테이블의 각 행이 JOIN 된 것이다. 단, SELECT 문에서 'num' 컬럼과 'name' 컬럼을 지정했기에 두 테이블의 해당 컬럼들이 JOIN 된 결과 테이블이 반환되었다.


참고 문서