하위 쿼리가 여러 행을 생성하는 경우 하나의 열로 정렬된 값을 표시할 수 있습니다.
~의
그럴 때 사용하는 것이 group_concat 함수인데, 이는 오라클에서 사용하는 LISTAGG의 개념이라고 할 수 있습니다.
~의
예를 들어 deer 테이블과 deer_son 테이블을 사용하면…
~의
~의
사슴 테이블)
DEER_KEY는 PK입니다.
사슴_키
|
이름
|
나이
|
하나
|
엘크
|
33
|
2
|
심술 궂은 사슴
|
31
|
DEER_SON 테이블)
사슴_키
|
DEER_SON_KEY
|
이름
|
나이
|
하나
|
하나
|
큰 사슴 아들 1
|
하나
|
하나
|
2
|
큰 사슴 아들 2
|
2
|
하나
|
삼
|
큰 사슴 아들 3
|
5
|
2
|
하나
|
언짢은 사슴 아들 1
|
17
|
2
|
2
|
언짢은 사슴 아들 2
|
DEER와 DEER_SON 테이블 간의 관계는 1:N이며,
이렇게 해서 서브 쿼리에 아들 이름을 넣으면 1개 이상의 행이 반환된다.
하위 쿼리는 1행 이상의 레코드를 반환합니다.
.?
무슨 소식이야
오류가 발생합니다.
~의
오류 쿼리)
SELECT A.DEER_KEY, A.NAME, A.AGE,
(SELECT B.NAME FROM DEER_SON B WHERE B.DEER_KEY = A.DEER_KEY) AS SON_NAME
FROM DEER A
-- 결과X. 오류
이 경우 group_concat을 사용하여 SON_NAME을 열로 표시할 수 있습니다.
SELECT A.DEER_KEY, A.NAME, A.AGE,
(SELECT GROUP_CONCAT(B.NAME SEPARATOR ',') FROM DEER_SON B WHERE B.DEER_KEY = A.DEER_KEY) AS SON_NAME
FROM DEER A
-------------------------------
--쿼리 결과
DEER_KEY NAME AGE SON_NAME
1 큰 사슴 33 큰 사슴 아들1, 큰사슴 아들2
SEPARATOR에 의해 ‘,’로 구분되어 하나의 열에 포함될 수 있습니다.
‘-‘를 쓸 수 있는 유용한 곳이 많을 거에요!