Шукати в базі даних Oracle таблиці з конкретними іменами стовпців?


94

У нас є велика база даних Oracle з безліччю таблиць. Чи є спосіб, за допомогою якого я можу здійснити запит або здійснити пошук, чи є таблиці з певними назвами стовпців?

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

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

Відповіді:


198

Щоб знайти всі таблиці з певним стовпцем:

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, якщо користувач, до якого ви входите, оскільки не має доступу до деяких таблиць.
Джеффрі Кемп,

Правда, але лише в тому випадку, якщо користувач, до якого ви підключені, має привілеї ВИБЕРИТИ БУДЬ-ЯКУ СТОЛ.
Тоні Ендрюс

2
Додайте column_name+, likeякщо ви не впевнені в точній назві:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

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. Очевидно, ви повинні мати привілеї вибору на іншій
схемі

SELECT * FROM COLSнічого не повертає з моєї схеми. У мене є лише привілеї вибору на таблицях. Чи буде цього недостатньо, щоб дозволити мені переглянути його через COLS?
Девід Онілл

select * from schema1.colsвидає мені table or view does not existпомилку. Чи буде це пов’язано з тим, як встановлюються привілеї?
Девід Онілл

Так би. Здається, відповідь Тоні Ендрю, мабуть, краща для вашої ситуації. Я забув про перегляд "all_tab_columns".
JosephStyons

10

ДЛЯ пошуку назви стовпця використовуйте наведений нижче запит, якщо ви точно знаєте назву стовпця:

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.