테이블 A
code(pk) | part(pk) | numb(pk) | recp_date | gubn(pk) | du(pk) | cu(pk) | qty |
11 | 1 | 1001 | 20181125 | 10 | 01 | 03 | 10 |
11 | 101 | 1001 | 20181125 | 10 | 01 | 03 | 20 |
11 | 2 | 101 | 20181125 | 10 | 02 | 01 | 10 |
테이블 B
code(pk) | part(pk) | numb(pk) | gubn(pk) | du(pk) | cu(pk) |
11 | 1 | 1001 | 10 | 01 | 03 |
11 | 101 | 1001 | 10 | 01 | 03 |
11 | 2 | 101 | 10 | 02 | 01 |
11 | 2 | 102 | 10 | 02 | 02 |
11 | 2 | 103 | 10 | 02 | 03 |
테이블 C
code(pk) | part(pk) | numb(pk) | name | enter_date |
11 | 1 | 1001 | 철수 | 20180301 |
11 | 1 | 102 | 민수 | 20170101 |
11 | 2 | 101 | 창수 | 20160501 |
11 | 2 | 102 | 영희 | 20140328 |
11 | 2 | 103 | 영수 | 20180601 |
위 세개 테이블이 있습니다.
테이블 A는 외부로부터 수신받은 데이터 입니다.
테이블 B는 A와 du / cu 컬럼 코드 값으로 매칭시켜 관리하는 테이블 이라고 합니다..
테이블 C는 주 테이블로 세 테이블의 공통 컬럼인 part와/numb을 등록하는 테이블입니다.
문제는 테이블 A의 노란색 배경 데이터 입니다.
테이블 C에는 part : 101 numb : 1001로 등록된 데이터가 없으나, 외부에서 데이터를 저렇게 넘겨주고 part : 1 numb : 1001로 표시되길 원합니다.
제가 생각 했을 시에는 테이블 C와 테이블 B를 join하여 테이블 B에 part : 101 numb : 1001인 데이터를 나오지 않게 하고,
거기에 테이블 A를 또 조인시키는 방법이 떠오르는데,, 그렇게 하면 on절에 key값을 모두 사용할 수 없지 않을까해서요..
part와 numb 자체가 다르기때문에 조인을 어떻게 시켜야 할지 모르겠습니다..ㅠㅠ
음..고정값은 아니구요
테이블 A의 du cu컬럼과 테이블B의 du cu 컬럼을 연결시켜서 part와 numb을 보여주고 있는데요.
테이블C에 존재하는 part와 numh으로 보여줘야합니다..
현재 결과값은
Part Numb Qty
1 1001 10
101 1001 20
2 101 10
원하는 결과값은
Part Numb Qty
1 1001 10
1 1001 20
2 101 10
입니다. 두번째 데이터의 part가 101이아닌 1로 나오도록요..
위 데이터는 일부이고, part가 999 numb가 1001 du 01 cu 03일수도 있습니다
이 경우에도 테이블B의 du cu컬럼과 매칭시켜 part 1 numb 1001로 나와야하구요..
설명이 잘 되었는지 모르겠습니다..ㅠㅠ
WITH t_a(code, part, numb, recp_date, gubn, du, cu, qty) AS ( SELECT 11, 1, 1001, '20181125', '10', '01', '03', 10 FROM dual UNION ALL SELECT 11, 101, 1001, '20181125', '10', '01', '03', 20 FROM dual UNION ALL SELECT 11, 999, 1001, '20181125', '10', '01', '03', 30 FROM dual -- 추가 UNION ALL SELECT 11, 2, 101, '20181125', '10', '02', '01', 10 FROM dual ) , t_b(code, part, numb, gubn, du, cu) AS ( SELECT 11, 1, 1001, '10', '01', '03' FROM dual UNION ALL SELECT 11, 101, 1001, '10', '01', '03' FROM dual UNION ALL SELECT 11, 999, 1001, '10', '01', '03' FROM dual -- 추가 UNION ALL SELECT 11, 2, 101, '10', '02', '01' FROM dual UNION ALL SELECT 11, 2, 102, '10', '02', '02' FROM dual UNION ALL SELECT 11, 2, 103, '10', '02', '03' FROM dual ) , t_c(code, part, numb, name, enter_date) AS ( SELECT 11, 1, 1001, '철수', '20180301' FROM dual UNION ALL SELECT 11, 1, 102, '민수', '20170101' FROM dual UNION ALL SELECT 11, 2, 101, '창수', '20160501' FROM dual UNION ALL SELECT 11, 2, 102, '영희', '20140328' FROM dual UNION ALL SELECT 11, 2, 103, '영수', '20180601' FROM dual ) SELECT c.code , c.part , c.numb , c.name , a.recp_date , a.qty FROM t_a a , t_b b , t_c c WHERE a.code = b.code AND a.numb = b.numb AND a.gubn = b.gubn AND a.du = b.du AND a.cu = b.cu AND b.code = c.code AND b.part = c.part AND b.numb = c.numb ;
part 가 101 이 1 일 수 있어서 part 조건을 뺀건데요?
numb 가 999 가 1001 일 수 있어서 numb 조건을 빼야 한다면?
part, numb 둘 다 빼면 남은 조건은 code 와 gubn 뿐인데요?
하지만 이 값은 지금 예를 들어주신 걸 보면 변별력이 없습니다.
그냥 막 뺀다고 될게 아닐 건데요?
지금 원하시는 상황을 정확하게 이해해야만 도움을 드릴 수 있는데.
설명이 부족합니다. 예시도 부족하구요.
제가 다른 케이스가 없냐고 물어본 이유는
설명이 부족하여 샘플을 보고 설명과 조합하여 질문을 이해해 보려고 한 것입니다.
설명을 좀더 정확하게 해주시고, 셈플 케이스도 가능한 케이스 모두 보여주세요.
그리고 앞서 말씀드렸듯이. 조인이나 쿼리 관점, 프로그래밍 관점이 아닌
일반적인 실제 상황 관점으로 설명해 주세요.
실생활에서 왜 이런 자료가 발생하는지?
WITH t_a(code, part, numb, recp_date, gubn, du, cu, qty) AS ( SELECT 11, 1, 1001, '20181125', '10', '01', '03', 10 FROM dual UNION ALL SELECT 11, 101, 1001, '20181125', '10', '01', '03', 20 FROM dual UNION ALL SELECT 11, 999, 1001, '20181125', '10', '01', '03', 30 FROM dual -- 추가 UNION ALL SELECT 11, 7, 999, '20181125', '10', '01', '03', 40 FROM dual -- 추가 UNION ALL SELECT 11, 2, 101, '20181125', '10', '02', '01', 10 FROM dual ) , t_b(code, part, numb, gubn, du, cu) AS ( SELECT 11, 1, 1001, '10', '01', '03' FROM dual UNION ALL SELECT 11, 101, 1001, '10', '01', '03' FROM dual UNION ALL SELECT 11, 999, 1001, '10', '01', '03' FROM dual -- 추가 UNION ALL SELECT 11, 7, 999, '10', '01', '03' FROM dual -- 추가 UNION ALL SELECT 11, 2, 101, '10', '02', '01' FROM dual UNION ALL SELECT 11, 2, 102, '10', '02', '02' FROM dual UNION ALL SELECT 11, 2, 103, '10', '02', '03' FROM dual ) , t_c(code, part, numb, name, enter_date) AS ( SELECT 11, 1, 1001, '철수', '20180301' FROM dual UNION ALL SELECT 11, 1, 102, '민수', '20170101' FROM dual UNION ALL SELECT 11, 2, 101, '창수', '20160501' FROM dual UNION ALL SELECT 11, 2, 102, '영희', '20140328' FROM dual UNION ALL SELECT 11, 2, 103, '영수', '20180601' FROM dual ) SELECT c.code , c.part , c.numb , c.name , a.recp_date , a.qty FROM t_a a , t_b x -- 추가(a 와 b 사이에 연결고리 x 추가) , t_b b , t_c c WHERE a.code = x.code AND a.part = x.part AND a.numb = x.numb ------------------- AND x.gubn = b.gubn AND x.du = b.du AND x.cu = b.cu ------------------- AND b.code = c.code AND b.part = c.part AND b.numb = c.numb ;