다음과 같은 경우 쿼리를 어떻게 짜야 좋을지 도움 부탁드립니다. 0 5 644

by GPLWorkerG [SQL Query] [2020.06.26 17:02:32]



안녕하세요. 초보적인 질문일지 모르겠는데...

다음과 같은 두 개의 테이블이 있는데요

테이블 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 테이블) =>  

위의 결과를 얻어낼수 있는 쿼리를 어떻게 작성해야 될지 도움 부탁드립니다.
감사합니다.
 

by 춘 [2020.06.26 18:20:16]
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
;

 


by GPLWorkerG [2020.06.26 19:36:10]

답변 감사합니다.
근데 해석하기가 어렵네요...

제가 뭔가 질문을 잘못 드린것 같습니다.
원하는 것은 A.mt_seq = B.mch_mtr_seq인 것을 모두 뽑아내면서 B.mch_mte_seq=A.mt_seq인 A.mt_name을 뽑아 낼려고합니다.
A.mt_name이 이름입니다.
아무튼 감사합니다.
 


by 춘 [2020.06.26 22:58:09]

처음 문의 주신 표에서 변경이 되셨을 뿐만 아니라,

"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 을 뽑아내려고 하신다는게 저는 잘 이해하기 힘드네요...

님이 말씀하시는 부분을 이해하시는 다른분이 답변을 드릴 수 있을 것 같네요...


by 마농 [2020.06.29 08:03:06]

질문하실 때 샘플은 정확하게 주시는게 좋습니다.
- 결과표에 나오는 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

 


by GPLWorkerG [2020.06.29 09:59:25]

답변 주신 분들 모두 감사합니다~
그냥 쿼리 두 번 날리고 코드에서 약간 가공해서 해결했습니다.

감사합니다.

p.s.
질문자 자체가 질문이 명쾌하지 못해 죄송합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입