문제)
기존에 설계되어 있는 테이블이 몇백개 있습니다.
그런데 ERD나 테이블 정의서가 없습니다.
일일이 비교할수는 없는데 몇개를 찾아보니
테이블끼리 같은 스키마를 가지고 있는것이 있습니다.
예를 들어 테이블 A가 필드를 10개 가지고 있는데,
테이블 B의 필드 10와 서로 이름이 다 같습니다.
명명규칙을 적용했다고 봤을때 같은 기능을 하는 테이블이라고
보고 이런 테이블들을 쿼리로 추출하고 싶은데요.
테이블끼리 전 필드명이 같은 테이블끼리 뽑으려고 합니다.
딕셔너리를 이용하면 가능할듯도 싶고..
방법이 있으면 좀 알려주시기 바랍니다.
답변)
계층쿼리와 USER_TAB_COLUMNS 를 사용해서 아래와 같이 쿼리를 실행하시면,
결과는 아래와 같은 형태로 나옵니다.
GRP_TN
-------
A
B,C <=== B와 C테이블은 구성컬럼명이 동일
D
E
F,G,H <=== F,G,H테이블은 구성컬럼명이 동일
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (TN, ',')), 2) GRP_TN
FROM (SELECT TN
, GRP_CN
, ROW_NUMBER () OVER (PARTITION BY GRP_CN ORDER BY TN) RN_TN
FROM (SELECT TN
, MAX (SYS_CONNECT_BY_PATH (CN, ',')) GRP_CN
FROM (SELECT TABLE_NAME TN
, COLUMN_NAME CN
, ROW_NUMBER () OVER (PARTITION BY TABLE_NAME ORDER BY COLUMN_NAME) RN
FROM USER_TAB_COLUMNS)
START WITH RN = 1
CONNECT BY PRIOR RN = RN - 1
AND PRIOR TN = TN
GROUP BY TN))
START WITH RN_TN = 1
CONNECT BY PRIOR RN_TN = RN_TN - 1
AND PRIOR GRP_CN = GRP_CN
GROUP BY GRP_CN
ORDER BY GRP_TN