안녕하세요. 초보적인 질문일지 모르겠는데...
다음과 같은 두 개의 테이블이 있는데요
테이블 A
+--------+---------+
| mt_seq | mt_name |
+--------+---------+
| 1 | 고길동 |
| 2 | 추길동 |
| 7 | 우길동 |
| 12 |장길동 |
| 13 |이길동 |
+--------+---------+
테이블 B
+---------+-------------+
| mch_mtr_seq | mch_mte_seq |
+-----------+-------------+
| 1 | 3 |
| 1 | 8 |
| 1 | 14 |
| 2 | 4 |
| 2 | 4 |
+------------+-------------+
원하는 결과는
A 테이블의 mt_seq와 연관된 B 테이블의 모든 이름을 보여 줄려고 합니다.
고길동(A 테이블) => Kang, Yang, Cha
추길동(A 테이블) => Yoo, Lee
우길동(A 테이블) =>
장길동(A 테이블) =>
이길동(A 테이블) =>
위의 결과를 얻어낼수 있는 쿼리를 어떻게 작성해야 될지 도움 부탁드립니다.
감사합니다.
WITH t1 AS ( SELECT 1 mt_seq, '멘토' mt_type, 'bbb@naver.com' mt_id, '고길동' mt_name FROM dual UNION ALL SELECT 2, '멘토', 'ccc@hanmail.com', '추길동' FROM dual UNION ALL SELECT 7, '멘토', 'qqq@gmail.com', '우길동' FROM dual UNION ALL SELECT 12, '멘토', 'nnn@daum.com', '장길동' FROM dual UNION ALL SELECT 13, '멘토', 'eee@naver.com', '이길동' FROM dual ), t2 AS ( SELECT 1 mch_seq, 1 mch_mtr_seq, 3 mch_mte_seq, '멘티' mt_type, 'Kang' mt_name FROM dual UNION ALL SELECT 2, 1, 8, '멘티', 'Yang' FROM dual UNION ALL SELECT 3, 1, 14, '멘티', 'Cha' FROM dual UNION ALL SELECT 4, 2, 4, '멘티', 'Yoo' FROM dual UNION ALL SELECT 5, 2, 4, '멘티', 'Lee' FROM dual ) SELECT a.mt_seq AS mt_seq , a.mt_name AS mt_name , LISTAGG(b.mt_name, ', ') WITHIN GROUP (ORDER BY b.mt_name) AS names FROM t1 a LEFT JOIN ( SELECT t1.mt_seq AS mt_seq , t2.mt_name AS mt_name FROM t1 INNER JOIN t2 ON t1.mt_seq = t2.mch_mtr_seq ) b ON a.mt_seq = b.mt_seq GROUP BY a.mt_seq, a.mt_name ;
처음 문의 주신 표에서 변경이 되셨을 뿐만 아니라,
"A.mt_seq = B.mch_mtr_seq인 것을 모두 뽑아내면서 B.mch_mte_seq=A.mt_seq인 A.mt_name을 뽑아 낼려고합니다."
이 부분은 무슨 말씀인지 모르겠네요...
테이블 A 의 mt_seq = 테이블 B 의 mch_mtr_seq 와 JOIN 조건으로 타당하지만,
B.mch_mte_seq = A.mt_seq 는 JOIN 조건절로 하시려는게 맞나요?
A 테이블에 mt_seq 값이 1, 2, 7, 12, 13 이고, B 테이블의 mch_mte_seq 값이 3, 8, 14, 4, 4 인데,
그걸 JOIN 을 걸어서 A.mt_name 을 뽑아내려고 하신다는게 저는 잘 이해하기 힘드네요...
님이 말씀하시는 부분을 이해하시는 다른분이 답변을 드릴 수 있을 것 같네요...
질문하실 때 샘플은 정확하게 주시는게 좋습니다.
- 결과표에 나오는 Kang, Yang, Cha 가 원본에도 있어야 하겠죠,
- 원본대비 결과표가 정확해야하고 그에 대한 설명이 명확해야 합니다.
사용하시는 DBMS 종류나 버전에 따라 구문이 다를 수 있습니다.
- DBMS 종류 및 버전을 명시해 주시는게 좋습니다.
-- MariaDB 10.4 에서 test -- WITH t_a AS ( SELECT 1 mt_seq, '고길동' mt_name UNION ALL SELECT 2, '추길동' UNION ALL SELECT 7, '우길동' UNION ALL SELECT 12, '장길동' UNION ALL SELECT 13, '이길동' UNION ALL SELECT 3, 'Kang' UNION ALL SELECT 8, 'Yang' UNION ALL SELECT 14, 'Cha' UNION ALL SELECT 4, 'Yoo' UNION ALL SELECT 5, 'Lee' ) , t_b AS ( SELECT 1 mch_mtr_seq, 3 mch_mte_seq UNION ALL SELECT 1, 8 UNION ALL SELECT 1, 14 UNION ALL SELECT 2, 4 UNION ALL SELECT 2, 5 ) SELECT a.mt_seq , a.mt_name , GROUP_CONCAT(c.mt_name ORDER BY c.mt_seq) mt_names FROM t_a a LEFT OUTER JOIN t_b b ON a.mt_seq = b.mch_mtr_seq LEFT OUTER JOIN t_a c ON b.mch_mte_seq = c.mt_seq GROUP BY a.mt_seq, a.mt_name ; -- http://gurubee.net/article/55512