안내
본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다.
Stackoverflow URL
http://stackoverflow.com/questions/20214848/cross-product-of-columns/20214908
SQLFiddle URL
http://sqlfiddle.com/#!2/9264d7/2/0
질문
다음과 같은 테이블이 존재한다.
SELECT * FROM test;
 
+------+------+-------+--------+
| name | age  | spent | gender |
+------+------+-------+--------+
| De   |   26 |    10 | M      |
| FU   |   27 |    29 | F      |
+------+------+-------+--------+
2 rows in set (0.00 sec)
이때 아래와 같은 결과를 얻고 싶은데 어떻게 하면 될까?
+------+------+-------+--------+
| name | age  | spent | gender |
+------+------+-------+--------+
| De   |   26 |    10 | M      |
| FU   |   26 |    10 | M      |
| De   |   27 |    10 | M      |
| FU   |   27 |    10 | M      |
| De   |   26 |    29 | M      |
...
답변
질문자의 의도가 명확하지는 않다. 유추하기로는 각 컬럼의 UNIQUE한 값들의 조합을 알고 싶은 것 같았다. 다음과 같은 SQL을 제안했고 질문자가 원하던 결과를 출력한다는 피드백을 받았다.
SELECT *
FROM
(
    SELECT DISTINCT name
    FROM test
) x CROSS JOIN
(
    SELECT DISTINCT age
    FROM test
) y CROSS JOIN
(
    SELECT DISTINCT spent
    FROM test
) z CROSS JOIN
(
    SELECT DISTINCT gender
    FROM test
) a;
 
+------+------+-------+--------+
| name | age  | spent | gender |
+------+------+-------+--------+
| De   |   26 |    10 | M      |
| FU   |   26 |    10 | M      |
| De   |   27 |    10 | M      |
| FU   |   27 |    10 | M      |
| De   |   26 |    29 | M      |
| FU   |   26 |    29 | M      |
| De   |   27 |    29 | M      |
| FU   |   27 |    29 | M      |
| De   |   26 |    10 | F      |
| FU   |   26 |    10 | F      |
| De   |   27 |    10 | F      |
| FU   |   27 |    10 | F      |
| De   |   26 |    29 | F      |
| FU   |   26 |    29 | F      |
| De   |   27 |    29 | F      |
| FU   |   27 |    29 | F      |
+------+------+-------+--------+
16 rows in set (0.00 sec)
x, y, z, a 같은 inlinew view 1개마다 각 컬럼의 UNIQUE한 값을 추출한 뒤에 모든 테이블을 CROSS JOIN 하면 질문자가 원한 결과를 얻을 수 있다.
“MySQL” 카테고리의 추천 글
- MySQL IN subquery 성능. IN sub query는 가급적 사용을 피하자
 - MySQL의 IN() v.s. EXISTS v.s. INNER JOIN 성능 비교
 - MySQL INNER JOIN v.s EXISTS 성능 비교
 - JOIN에서 중복된 레코드 제거하기
 - MySQL 중복 레코드 관리 방법 - INSERT IGNORE, REPLACE INTO, ON DUPLICATE UPDATE
 - MySQL GROUP BY 성능 최적화를 위한 INDEX 설계
 - MySQL Query Cache를 빠르게 비우기
 - MySQL Plugin에 대한 간단한 소개
 - MySQL InnoDB Index Statistics
 - MySQL Foreign key 사용 시 주의 사항 (Can’t create table (errno: 150))