개발하는 동안에 두 테이블간의 테이블 구조를 비교할 경우가 간혹 생깁니다. 두 테이블의 DDL문을 뽑아서 눈으로 직접 비교할 수도 있지만, 아래의 쿼리를 사용하면 편하게 비교할 수 있습니다. 두 개의 테이블에서 컬럼명, 데이터 타입, 널 여부, 컬럼 순서 등의 정보들을 각각 비교하여 서로 틀린 점이 있는 컬럼 정보를 확인하기 위해 사용하는 쿼리입니다. FULL OUTER JOIN 을 사용하여 비교하므로 두 개의 테이블이 모두 기준이 됩니다. 테이블명 뒤에 디비 링크 정보를 추가하여 다른 DB 서버의 테이블과도 비교가 가능합니다. 아래 샘플은 USER_AAA.TABLE_AAA, USER_BBB.TABLE_BBB 두 개의 테이블을 비교하고 있습니다. WITH A AS ( SELECT COLUMN_NAME AS X_COLUMN_NAME, DATA_TYPE AS X_DATA_TYPE , DATA_LENGTH AS X_DATA_LENGTH, DATA_PRECISION AS X_DATA_PRECISION , DATA_SCALE AS X_DATA_SCALE, NULLABLE AS X_NULLABLE , COLUMN_ID AS X_COLUMN_ID FROM ALL_TAB_COLUMNS WHERE OWNER = 'USER_AAA' AND TABLE_NAME = 'TABLE_AAA' ), B AS ( SELECT COLUMN_NAME AS Y_COLUMN_NAME, DATA_TYPE AS Y_DATA_TYPE , DATA_LENGTH AS Y_DATA_LENGTH, DATA_PRECISION AS Y_DATA_PRECISION , DATA_SCALE AS Y_DATA_SCALE, NULLABLE AS Y_NULLABLE , COLUMN_ID AS Y_COLUMN_ID FROM ALL_TAB_COLUMNS WHERE OWNER = 'USER_BBB' AND TABLE_NAME = 'TABLE_BBB' ) SELECT CASE WHEN X_COLUMN_NAME <> Y_COLUMN_NAME THEN 'COLUMN_NAME' WHEN X_DATA_TYPE <> Y_DATA_TYPE THEN 'DATA_TYPE' WHEN X_DATA_LENGTH <> Y_DATA_LENGTH THEN 'DATA_LENGTH' WHEN X_DATA_PRECISION <> Y_DATA_PRECISION THEN 'DATA_PRECISION' WHEN X_DATA_SCALE <> Y_DATA_SCALE THEN 'DATA_SCALE' WHEN X_NULLABLE <> Y_NULLABLE THEN 'NULLABLE' WHEN X_COLUMN_ID <> Y_COLUMN_ID THEN 'COLUMN_ID' WHEN X_COLUMN_NAME IS NULL THEN 'X_NULL' WHEN Y_COLUMN_NAME IS NULL THEN 'Y_NULL' END AS DIFF , M.* FROM ( SELECT A.*, B.* FROM A FULL OUTER JOIN B ON A.X_COLUMN_NAME = B.Y_COLUMN_NAME ) M WHERE X_COLUMN_NAME <> Y_COLUMN_NAME OR X_DATA_TYPE <> Y_DATA_TYPE OR X_DATA_LENGTH <> Y_DATA_LENGTH OR X_DATA_PRECISION <> Y_DATA_PRECISION OR X_DATA_SCALE <> Y_DATA_SCALE OR X_NULLABLE <> Y_NULLABLE OR X_COLUMN_ID <> Y_COLUMN_ID OR X_COLUMN_NAME IS NULL OR Y_COLUMN_NAME IS NULL ORDER BY X_COLUMN_ID
[정정] 서로 다른 스키마에 있는 테이블 비교하는 방법 좀 알려주세요 0 8 5,951 by 박동혁 [2009.07.01 14:50:41] 안녕하세요. 몇년만에 오라클업무를 하게 되었습니다. 오늘 처음으로 받은 업무가... 서로 다른 스키마에 있는 테이블들을 전부 비교하는 것 입니다. 그리고, 그 2개의 스키마(UK1_ID, GARA_ID)의 테이블정의는 똑같게 되어있어 있습니다. 그러나 현재 각각의 사용자에 의해서 데이타가 틀어져 있는 것으로 판단되어서... 양쪽의 스키마의 테이블 값을 체크 하려고 합니다. 혹은 같은지를.... 테이블수도 많고...각각 테이블의 컬럼수도 만만치가 않습니다. 그래서, 고수님들의 도움을 받고자 합니다. 오랜만에 오라클로 컴백한 초보오라클유저에게 도움 주시기를 바랍니다. 감사합니다. p.s. select * from DICT; 를 사용하면 될꺼라고 하는데...아직 어찌해야 할지 모르겠습니다. 더불어......위의 스키마에 있는 각각의 테이블들의 테이블정의를 비교 하는 방법도 부탁드립니다. by 마농 [2009.07.01 15:49:55]
SELECT * FROM dba_tab_columns WHERE owner = 'UK1_ID' by 박동혁 [2009.07.01 16:21:07]
마농님!! by 마농 [2009.07.01 16:38:36]
양쪽을 비교하려면 양쪽 정보을 다 볼 수 있어야 하는데요 by 박동혁 [2009.07.01 17:25:19]
마농님, 감사합니다. by 마농 [2009.07.01 17:36:48]
조인을 잘 하신것인지는 모르겠네요. by 박동혁 [2009.07.02 10:34:44]
마농님, 맞습니다. 그런데...이렇게 해서 원하는 결과를 얻을수 있을지 모르겠습니다. by 마농 [2009.07.02 10:50:49]
진행하시는 방법이 맞습니다. by 박동혁 [2009.07.02 10:57:19]
마농님이께서 이렇게 진행해도 좋다고 하니...한결 편하게 작업할수 있겠습니다. 다시한번 좋은 답변에 대해서 감사드립니다. |