[sql] Oracle 데이터베이스에서 특정 열 이름이있는 테이블을 검색 하시겠습니까?

테이블이 많은 대규모 Oracle 데이터베이스가 있습니다. 특정 열 이름을 가진 테이블이 있는지 찾기 위해 쿼리하거나 검색 할 수있는 방법이 있습니까?

IE는 열이있는 모든 테이블을 표시합니다. id, fname, lname, address

추가하는 것을 잊은 세부 정보 : 다른 스키마를 검색 할 수 있어야합니다. 연결하는 데 사용해야하는 테이블은 검색해야하는 테이블을 소유하지 않습니다.



답변

특정 열이있는 모든 테이블을 찾으려면 :

select owner, table_name from all_tab_columns where column_name = 'ID';

4 개의 열 중 일부 또는 모두가있는 테이블을 찾으려면 다음을 수행하십시오.

select owner, table_name, column_name
from all_tab_columns
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS');

4 개의 열이 모두있는 테이블을 찾으려면 (누락되지 않음) :

select owner, table_name
from all_tab_columns
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS')
group by owner, table_name
having count(*) = 4;


답변

원하는 데이터는 “cols”메타 데이터 테이블에 있습니다.

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

이것은 원하는 모든 열이있는 테이블 목록을 제공합니다 .

select distinct
  C1.TABLE_NAME
from
  cols c1
  inner join
  cols c2
  on C1.TABLE_NAME = C2.TABLE_NAME
  inner join
  cols c3
  on C2.TABLE_NAME = C3.TABLE_NAME
  inner join
  cols c4
  on C3.TABLE_NAME = C4.TABLE_NAME
  inner join
  tab t
  on T.TNAME = C1.TABLE_NAME
where T.TABTYPE = 'TABLE' --could be 'VIEW' if you wanted
  and upper(C1.COLUMN_NAME) like upper('%id%')
  and upper(C2.COLUMN_NAME) like upper('%fname%')
  and upper(C3.COLUMN_NAME) like upper('%lname%')
  and upper(C4.COLUMN_NAME) like upper('%address%')  

다른 스키마에서이를 수행하려면 다음과 같이 테이블 앞에 스키마를 지정하기 만하면됩니다.

SELECT * FROM SCHEMA1.COLS WHERE COLUMN_NAME LIKE '%ID%';

여러 스키마 검색을 하나의 출력 결과로 결합하려는 경우 다음을 수행 할 수 있습니다.

SELECT DISTINCT
  'SCHEMA1' AS SCHEMA_NAME
 ,TABLE_NAME
FROM SCHEMA1.COLS
WHERE COLUMN_NAME LIKE '%ID%'
UNION
SELECT DISTINCT
  'SCHEMA2' AS SCHEMA_NAME
 ,TABLE_NAME
FROM SCHEMA2.COLS
WHERE COLUMN_NAME LIKE '%ID%'


답변

열 이름을 정확하게 알고있는 경우 열 이름을 검색하려면 아래 쿼리를 사용하십시오.

select owner,table_name from all_tab_columns where upper(column_name) =upper('keyword');

아래에서 정확한 열 사용을 모르는 경우 열 이름을 검색하려면 :

select owner,table_name from all_tab_columns where upper(column_name) like upper('%keyword%');


답변

다음은 SQLPlus 내에서 쉽게 실행할 수 있도록 findcol.sql에 저장 한 것입니다.

set verify off
clear break
accept colnam prompt 'Enter Column Name (or part of): '
set wrap off
select distinct table_name,
                column_name,
                data_type || ' (' ||
                decode(data_type,'LONG',null,'LONG RAW',null,
                       'BLOB',null,'CLOB',null,'NUMBER',
                       decode(data_precision,null,to_char(data_length),
                              data_precision||','||data_scale
                             ), data_length
                      ) || ')' data_type
  from all_tab_columns
 where column_name like ('%' || upper('&colnam') || '%');
set verify on


답변