안내
본 문서는 블로그의 운영자인 본인이 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))