선배님들 안녕하십니까
쿼리 작성중에 어려움이 있어서 도움을 요청드립니다, 꼭 혼자서 해결하고 싶어 몇일간 붙잡고 있지만 쉽지가 않네요..
제가 원하는 결과는 오라클11g 환경에서 db의 모든(or 특정 유저) 테이블 정보와 그 테이블에 속한 컬럼정보, 컬럼의 pk 여부, fk여부를 조회하는겁니다
(다른 유저에 같은 이름의 테이블 주의, 건수는 실제 건수를 세진 않고 dba_tables에 num_rows면 됩니다)
원하는 결과의 모습은 이미지를 첨부했습니다
작성중에 참고한 테이블은
dba_tables
dba_tab_comments
dba_tab_columns
dba_col_comments
dba_tab_columns
dba_constraints
dba_cons_columns
위 테이블을 이용해 작성해 보려고 해보았으나.. pk, fk부분을 해결하지 못했습니다.. ㅠㅠ
select a.owner, a.table_name, b.comments, a.num_rows , c.table_name,c.column_id, c.column_name, d.comments, c.data_type, c.data_length, c.nullable
from
dba_tables a
,dba_tab_comments b
,dba_tab_columns c
,dba_col_comments d
where a.owner = b.owner
and a.table_name = b.table_name
and a.owner(+) = c.owner
and a.table_name(+) = c.table_name
and c.owner = d.owner
and c.table_name = d.table_name
and c.column_name = d.column_name
and a.owner in
(
'SCOTT'
)
order by a.owner, a.table_name,c.column_id
조언 부탁 드립니다 감사합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | SELECT A.OWNER , A.TABLE_NAME , B.COMMENTS , A.NUM_ROWS , C.TABLE_NAME , C.COLUMN_ID , C.COLUMN_NAME , D.COMMENTS , C.DATA_TYPE , C.DATA_LENGTH , C.NULLABLE , CASE WHEN ( SELECT COUNT (*) FROM DBA_CONSTRAINTS AA , DBA_CONS_COLUMNS BB WHERE AA.OWNER = BB.OWNER AND AA.TABLE_NAME = BB.TABLE_NAME AND AA.CONSTRAINT_NAME =BB.CONSTRAINT_NAME AND AA.OWNER = C.OWNER AND AA.TABLE_NAME =C.TABLE_NAME AND BB.OWNER=C.OWNER AND BB.TABLE_NAME=C.TABLE_NAME AND BB.COLUMN_NAME=C.COLUMN_NAME AND AA.CONSTRAINT_TYPE = 'P' AND POSITION IS NOT NULL ) >0 THEN 'Y' ELSE '' END AS PK_INFO , CASE WHEN ( SELECT COUNT (*) FROM DBA_CONSTRAINTS AA , DBA_CONS_COLUMNS BB WHERE AA.OWNER = BB.OWNER AND AA.TABLE_NAME = BB.TABLE_NAME AND AA.CONSTRAINT_NAME =BB.CONSTRAINT_NAME AND AA.OWNER = C.OWNER AND AA.TABLE_NAME =C.TABLE_NAME AND BB.OWNER=C.OWNER AND BB.TABLE_NAME=C.TABLE_NAME AND BB.COLUMN_NAME=C.COLUMN_NAME AND AA.CONSTRAINT_TYPE = 'R' AND POSITION IS NOT NULL ) >0 THEN 'Y' ELSE '' END AS FK_INFO FROM DBA_TABLES A , DBA_TAB_COMMENTS B , DBA_TAB_COLUMNS C , DBA_COL_COMMENTS D WHERE A.OWNER = B.OWNER(+) AND A.TABLE_NAME = B.TABLE_NAME(+) AND A.OWNER = C.OWNER AND A.TABLE_NAME = C.TABLE_NAME AND C.OWNER = D.OWNER(+) AND C.TABLE_NAME = D.TABLE_NAME(+) AND C.COLUMN_NAME = D.COLUMN_NAME(+) AND A.OWNER IN ( 'SCOTT' ) ORDER BY A.OWNER, A.TABLE_NAME,C.COLUMN_ID; |
테이블과 코멘트는 필수 사항이 아니기때문에 없을 수 있어서 현재 쿼리는 이렇게 수정되는게 어떨까요