질문을 올려서 다시 수정하여 올립니다.
(너무 두서 없이 질문을 올려서 죄송합니다)
table t1 (한 아이디에 구분값이 같은 사람들이 존재)
id | name | gubun |
1 | 홍길동 | 01 |
1 | 이영희 | 01 |
1 | 김철수 | 01 |
table t2 (가족관계)
name | name2 | gubun |
홍길동 | 이영희 | 배우자 |
홍길동 | 홍영수 | 자녀 |
홍길동 | 홍진희 | 자녀 |
이영희 | 홍길동 | 배우자 |
이영희 | 홍영수 | 자녀 |
이영희 | 홍진희 | 자녀 |
<원하는 결과값 >
id | name | gubun |
1 | 홍길동 | 01 |
1 | 이영희 | 01 |
1 | 김철수 | 02 |
table t1 의 데이터를 보시면 한 아이디에 같은 구분값을 가진 이름이 여러개 있는데요
table t2의 데이터의 가족관계를 이용하여 실제 가족으로 된 사람들을 같은 구분값으로 정리하려고 합니다.
고민하다가 table t1을 가공하여 아래처럼 table t3를 만들어서 구분값을 만들어보려고 했는데..
역시 잘못 생각했던거 같아서요
table t 3(가공테이블)
id | name | name_in | chk |
1 | 홍길동 | 홍길동,이영희,김철수 | 1 |
1 | 이영희 | 홍길동,이영희,김철수, | 1 |
1 | 김철수 | 홍길동,이영희,김철수 |
제 생각은 table t2(가족관계) 테이블을 이용하여 name2가 name_in에 포함되어 있으면
chk를 해서 같은 가구값을 만들고 싶어서요
혹시나 하고 in 을 아래처럼 써봤는데 안되더라구요
select t3.*,(case when t2.name2 in t3.name_in then 1 end) chk from t2,t3
where t2.name=t3.name
정리해본다고 했는데 역시 설명이 어렵네요
WITH t1 AS ( SELECT 1 id, '홍길동' name, '01' gubun FROM dual UNION ALL SELECT 1, '이영희', '01' FROM dual UNION ALL SELECT 1, '김철수', '01' FROM dual ) , t2 AS ( SELECT '홍길동' name, '이영희' name2, '배우자' gubun FROM dual UNION ALL SELECT '홍길동', '홍영수', '자녀' FROM dual UNION ALL SELECT '홍길동', '홍진희', '자녀' FROM dual UNION ALL SELECT '이영희', '홍길동', '배우자' FROM dual UNION ALL SELECT '이영희', '홍영수', '자녀' FROM dual UNION ALL SELECT '이영희', '홍진희', '자녀' FROM dual ) , t3 AS ( SELECT DISTINCT LEAST(name, name2) name1 , GREATEST(name, name2) name2 FROM t2 ) , t4 AS ( SELECT DISTINCT CONNECT_BY_ROOT(name1) name1 , name2 FROM t3 START WITH name1 NOT IN (SELECT name2 FROM t3) CONNECT BY PRIOR name2 = name1 ) SELECT a.id, a.name , DENSE_RANK() OVER(PARTITION BY id ORDER BY NVL(b.name1, a.name)) gubun FROM t1 a LEFT OUTER JOIN t4 b ON a.name = name2 ;