Cerchi tabelle con nomi di colonna specifici in un database Oracle?


94

Abbiamo un grande database Oracle con molte tabelle. C'è un modo per interrogare o cercare per trovare se ci sono tabelle con determinati nomi di colonna?

IE mi mostra tutte le tabelle che hanno le colonne: id, fname, lname, address

Dettaglio che ho dimenticato di aggiungere: devo essere in grado di cercare attraverso diversi schemi. Quello che devo usare per connettermi non possiede le tabelle in cui devo cercare.

Risposte:


198

Per trovare tutte le tabelle con una colonna particolare:

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

Per trovare tabelle che hanno una o tutte le 4 colonne:

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

Per trovare tabelle che hanno tutte e 4 le colonne (senza nessuna mancante):

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
Probabilmente dovresti usare DBA_TAB_COLUMNS invece di ALL_TAB_COLUMNS per eseguire questa ricerca, nel caso in cui l'utente a cui stai effettuando l'accesso non abbia accesso ad alcune tabelle.
Jeffrey Kemp

Vero, ma solo se l'utente a cui sei connesso dispone del privilegio SELEZIONA QUALSIASI TABELLA.
Tony Andrews

2
Aggiungi column_name+ likese non sei sicuro del nome esatto:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

10

I dati che desideri si trovano nella tabella dei metadati "cols":

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

Questo ti darà un elenco di tabelle con tutte le colonne che desideri:

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

Per fare ciò in uno schema diverso, è sufficiente specificare lo schema davanti alla tabella, come in

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

Se vuoi combinare le ricerche di molti schemi in un unico risultato di output, puoi farlo:

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

Come lo uso per esaminare uno schema diverso? (Ho dimenticato di menzionare tale richiesta nella mia domanda originale)
David Oneill

Basta anteporre il nome dello schema all'inizio di ogni nome di tabella ... cioè myschema.c1. Ovviamente devi avere i privilegi di selezione sull'altro schema
wadesworld

SELECT * FROM COLSnon restituisce nulla dal mio schema. Ho solo privilegi di selezione sui tavoli. Selezionare non sarebbe sufficiente per consentirmi di visualizzarlo tramite COLS?
David Oneill,

select * from schema1.colsmi dà un table or view does not existerrore. Avrebbe a che fare con la configurazione dei privilegi?
David Oneill,

Sì, lo sarebbe. Sembra che la risposta di Tony Andrew sia probabilmente migliore per la tua situazione. Mi ero dimenticato della visualizzazione "all_tab_columns".
JosephStyons

10

PER cercare il nome di una colonna, utilizzare la query seguente se si conosce il nome della colonna in modo accurato:

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

PER cercare il nome di una colonna se non si conosce l'uso accurato della colonna di seguito:

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

0

Eccone uno che abbiamo salvato su findcol.sql in modo da poterlo eseguire facilmente da 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.