상황 설명 드리면
2개의 계정에 테이블및 속성 정보가 동일 해야 하는데 수정 작업 발생시 어느 한쪽만 반영했었을 때를 대비해서 비교하는 쿼리 입니다.
비교해야 하는 테이블 목록이 정의 되어 있는 테이블은 따로 있습니다.
테이블은 대략 이렇게 되어 있습니다.
WITH TAB_LIST AS (
SELECT 'EMP' TABLE_NM FROM DUAL
UNION SELECT 'DEPT' FROM DUAL
UNION SELECT 'PAY' FROM DUAL
UNION SELECT 'GROUP' FROM DUAL
UNION SELECT 'ADDR' FROM DUAL
UNION SELECT 'PRODUCT' FROM DUAL
), TMP_TAB_COLUMNS AS (
SELECT 'HH' OWNER, 'EMP' TABLE_NAME, 1 COL_ID, '사번' COL_NM, 'VAR(20)' COL_TYPE FROM DUAL
UNION SELECT 'HH', 'EMP', 2, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'EMP', 3, '생년월일', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'DEPT', 1, '조직명', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'DEPT', 2, '상위부서코드', 'CHAR(10)' FROM DUAL
UNION SELECT 'HH', 'PAY', 1, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'PAY', 2, '월급', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'GROUP', 1, '부서명', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'ADDR', 1, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'HH', 'ADDR', 2, '주소', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'EMP', 1, '사번', 'VAR(20)' FROM DUAL
UNION SELECT 'XX', 'EMP', 2, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'DEPT', 1, '조직명', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'DEPT', 2, '상위부서코드', 'NUMBER' FROM DUAL
UNION SELECT 'XX', 'PAY', 1, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'PAY', 2, '월급', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'PAY', 3, '급여일자', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'ADDR', 1, '성명', 'VAR(10)' FROM DUAL
UNION SELECT 'XX', 'ADDR', 2, '주소', 'VAR(10)' FROM DUAL
)
SELECT *
FROM TAB_LIST T
, ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'HH' ) H
, ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'XX' ) X
WHERE T.TABLE_NM = H.TABLE_NAME(+)
AND T.TABLE_NM = X.TABLE_NAME(+)
제 짧은 지식으로 생각 했을때는 검증해야 할 테이블 목록이 있는 TAB_LIST 를 기준 삼아 A=H(+), A=X(+) 이렇게 하면 A=H(+)=X(+) 이렇게 나올거 생각 했는데 H=X의 곱이 나오더라구요.
해서 급한데로 MINUS 연산자로 H - X 랑 X - H 해서 서로 상이 한거는 식별 하고 대상목록에는 있는데 양쪽 계정에 테이블이 없는 경우 따로 또 조회를 해서 대충 화면상에 아웃풋은 나오는데 효율적이지 못한거 같아서요
제가 원하는건 A=H(+)=X(+) 이렇게 나오는건데 조인을 어떻게 해야지 이렇게 나올수 있을까요??
답변 부탁 드립니다.~!
원하는 결과는 이렇게 입니다.
EMP | HH | EMP | 1 | 사번 | VAR(20) | XX | EMP | 1 | 사번 | VAR(20) |
EMP | HH | EMP | 2 | 성명 | VAR(10) | XX | EMP | 2 | 성명 | VAR(10) |
EMP | HH | EMP | 3 | 생년월일 | VAR(10) | |||||
DEPT | HH | DEPT | 1 | 조직명 | VAR(10) | XX | DEPT | 1 | 조직명 | VAR(10) |
DEPT | HH | DEPT | 2 | 상위부서코드 | CHAR(10) | XX | DEPT | 2 | 상위부서코드 | NUMBER |
PAY | HH | PAY | 1 | 성명 | VAR(10) | XX | PAY | 1 | 성명 | VAR(10) |
PAY | HH | PAY | 2 | 월급 | VAR(10) | XX | PAY | 2 | 월급 | VAR(10) |
PAY | XX | PAY | 3 | 급여일자 | VAR(10) | |||||
ADDR | HH | ADDR | 1 | 성명 | VAR(10) | XX | ADDR | 1 | 성명 | VAR(10) |
ADDR | HH | ADDR | 2 | 주소 | VAR(10) | XX | ADDR | 2 | 주소 | VAR(10) |
PRODUCT |
-- 이런 결과를 원하는게 아닌가 하네요... -- 질문 하실 때 결과가 어떻게 나와야 하는지 표 형태 등으로 보여주시면 -- 답변하시는 분들이 알기 쉬울겁니다. WITH TAB_LIST AS ( SELECT 'EMP' TABLE_NM FROM DUAL UNION SELECT 'DEPT' FROM DUAL UNION SELECT 'PAY' FROM DUAL UNION SELECT 'GROUP' FROM DUAL UNION SELECT 'ADDR' FROM DUAL UNION SELECT 'PRODUCT' FROM DUAL ), TMP_TAB_COLUMNS AS ( SELECT 'HH' OWNER, 'EMP' TABLE_NAME, 1 COL_ID, '사번' COL_NM, 'VAR(20)' COL_TYPE FROM DUAL UNION SELECT 'HH', 'EMP', 2, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'EMP', 3, '생년월일', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'DEPT', 1, '조직명', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'DEPT', 2, '상위부서코드', 'CHAR(10)' FROM DUAL UNION SELECT 'HH', 'PAY', 1, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'PAY', 2, '월급', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'GROUP', 1, '부서명', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'ADDR', 1, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'HH', 'ADDR', 2, '주소', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'EMP', 1, '사번', 'VAR(20)' FROM DUAL UNION SELECT 'XX', 'EMP', 2, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'DEPT', 1, '조직명', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'DEPT', 2, '상위부서코드', 'NUMBER' FROM DUAL UNION SELECT 'XX', 'PAY', 1, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'PAY', 2, '월급', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'PAY', 3, '급여일자', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'ADDR', 1, '성명', 'VAR(10)' FROM DUAL UNION SELECT 'XX', 'ADDR', 2, '주소', 'VAR(10)' FROM DUAL ) SELECT * FROM TAB_LIST T , ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'HH' ) H , ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'XX' ) X WHERE T.TABLE_NM = H.TABLE_NAME(+) AND H.TABLE_NAME = X.TABLE_NAME(+) AND H.COL_ID = X.COL_ID(+)
-- TAB_LIST에만 존재할 수 있으면 SELECT * FROM TAB_LIST A LEFT OUTER JOIN ( SELECT H.OWNER OWNER_H, H.TABLE_NAME TABLE_NAME_H, H.COL_ID COL_ID_H ,H.COL_NM COL_NM_H, H.COL_TYPE COL_TYPE_H ,X.OWNER OWNER_X, X.TABLE_NAME TABLE_NAME_X, X.COL_ID COL_ID_X ,X.COL_NM COL_NM_X, X.COL_TYPE COL_TYPE_X ,NVL(H.TABLE_NAME,X.TABLE_NAME) TABLE_NAME FROM ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'HH' ) H FULL OUTER JOIN ( SELECT * FROM TMP_TAB_COLUMNS WHERE OWNER = 'XX' ) X ON (H.TABLE_NAME = X.TABLE_NAME AND H.COL_ID = X.COL_ID) ) B ON A.TABLE_NM = B.TABLE_NAME
--> 삽질이었습니다ㅋㅋ 아.. 부끄..ㅠ
SELECT a.table_nm , b.col_id , MIN(DECODE(b.owner, 'HH', b.col_nm )) hh_col_nm , MIN(DECODE(b.owner, 'HH', b.col_type)) hh_col_type , MIN(DECODE(b.owner, 'XX', b.col_nm )) xx_col_nm , MIN(DECODE(b.owner, 'XX', b.col_type)) xx_col_type FROM tab_list a , tmp_tab_columns b WHERE a.table_nm = b.table_name(+) GROUP BY a.table_nm, b.col_id ORDER BY a.table_nm, b.col_id ;