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

95

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

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

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

Дэвид Онейл
источник

Ответы:

201

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

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
Вероятно, вам следует использовать DBA_TAB_COLUMNS вместо ALL_TAB_COLUMNS для выполнения этого поиска, если пользователь, под которым вы входите, не имеет доступа к некоторым таблицам.
Джеффри Кемп,
Верно, но только если пользователь, с которым вы подключены, имеет привилегию SELECT ANY TABLE.
Тони Эндрюс,
2
Добавьте column_name+, likeесли не знаете точное имя:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R
11

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

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%');
user3141191
источник
10

Необходимые данные находятся в таблице метаданных 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%'
ДжозефСтайонс
источник
Как мне использовать это, чтобы посмотреть на другую схему? (Я забыл упомянуть об этом в моем первоначальном вопросе)
Дэвид Уэйлл
Просто добавьте имя схемы перед каждым именем таблицы ... т.е. myschema.c1. Очевидно, у вас должны быть привилегии выбора в другой схеме
wadesworld
SELECT * FROM COLSничего не возвращает из моей схемы. У меня есть только избранные привилегии на столах. Не было бы достаточно выбора, чтобы я мог просматривать его через COLS?
Дэвид Уэйлл,
select * from schema1.colsдает мне table or view does not existошибку. Связано ли это с настройкой привилегий?
Дэвид Уэйлл,
Да, было бы. Похоже, что ответ Тони Эндрю, вероятно, лучше для вашей ситуации. Я забыл о представлении «all_tab_columns».
JosephStyons
0

Вот тот, который мы сохранили в 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
Дуг Портер
источник