Cari database Oracle untuk tabel dengan nama kolom tertentu?

95

Kami memiliki database Oracle besar dengan banyak tabel. Adakah cara saya dapat melakukan kueri atau pencarian untuk menemukan jika ada tabel dengan nama kolom tertentu?

IE tunjukkan semua tabel yang memiliki kolom: id, fname, lname, address

Detail Saya lupa menambahkan: Saya harus dapat mencari melalui skema yang berbeda. Yang harus saya gunakan untuk menghubungkan tidak memiliki tabel yang perlu saya cari.

David Oneill
sumber

Jawaban:

200

Untuk menemukan semua tabel dengan kolom tertentu:

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

Untuk menemukan tabel yang memiliki salah satu atau semua dari 4 kolom:

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

Untuk menemukan tabel yang memiliki semua 4 kolom (tanpa ada yang hilang):

select owner, table_name
from all_tab_columns
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS')
group by owner, table_name
having count(*) = 4;
Tony Andrews
sumber
2
Anda mungkin harus menggunakan DBA_TAB_COLUMNS daripada ALL_TAB_COLUMNS untuk melakukan pencarian ini, jika pengguna yang Anda masuki tidak memiliki akses ke beberapa tabel.
Jeffrey Kemp
Benar, tetapi hanya jika pengguna Anda terhubung karena memiliki hak istimewa PILIH TABEL APA PUN.
Tony Andrews
2
Tambahkan column_name+ likejika Anda tidak yakin dengan nama persisnya:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R
10

Data yang Anda inginkan ada di tabel meta-data "cols":

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

Yang ini akan memberi Anda daftar tabel yang memiliki semua kolom yang Anda inginkan:

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

Untuk melakukan ini dalam skema yang berbeda, cukup tentukan skema di depan tabel, seperti di

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

Jika Anda ingin menggabungkan pencarian banyak skema menjadi satu hasil keluaran, maka Anda dapat melakukan ini:

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%'
JosephStyons
sumber
Bagaimana cara menggunakan ini untuk melihat skema yang berbeda? (Saya lupa menyebutkan persyaratan itu dalam pertanyaan awal saya)
David Oneill
Tambahkan saja nama skema di depan setiap nama tabel ... yaitu myschema.c1. Jelas Anda harus memiliki hak pilih pada skema lain
wadesworld
SELECT * FROM COLStidak mengembalikan apa pun dari skema saya. Saya hanya memiliki hak pilih di tabel. Apakah pemilihan tidak cukup untuk memungkinkan saya melihatnya melalui COLS?
David Oneill
select * from schema1.colsmemberi saya table or view does not existkesalahan. Apakah itu ada hubungannya dengan cara mengatur hak istimewa?
David Oneill
Ya, itu akan. Sepertinya jawaban Tony Andrew mungkin lebih baik untuk situasi Anda. Saya lupa tentang tampilan "all_tab_columns".
JosephStyons
10

UNTUK mencari nama kolom gunakan query di bawah ini jika Anda mengetahui nama kolom secara akurat:

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

UNTUK mencari nama kolom jika Anda tidak tahu penggunaan kolom yang akurat di bawah ini:

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

Ini adalah salah satu yang telah kami simpan ke findcol.sql sehingga kami dapat menjalankannya dengan mudah dari dalam 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
Doug Porter
sumber