Поиск в базе данных Oracle для таблиц с конкретными именами столбцов?

У нас есть большая база данных Oracle со многими таблицами. Есть ли способ, которым я могу выполнить запрос или поиск, чтобы найти, есть ли таблицы с определенными именами столбцов?

IE показать мне все таблицы, которые имеют столбцы: id, fname, lname, address

Подробно Я забыл добавить: мне нужно иметь возможность выполнять поиск по различным схемам. Тот, который я должен использовать для подключения, не имеет собственных таблиц, которые мне нужно выполнить.

Ответ 1

Чтобы найти все таблицы с определенным столбцом:

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;

Ответ 2

Данные, которые вы хотите, находятся в таблице метаданных "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%'

Ответ 3

Чтобы найти имя столбца, используйте приведенный ниже запрос, если вы точно знаете имя столбца:

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%');

Ответ 4

выберите table_name из dba_tab_columns где column_name = 'THE_COLUMN_YOU_LOOK_FOR';

Ответ 5

Вот один из них, который мы сохранили для findcol.sql, чтобы мы могли легко запускать его из SQLPlus

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