Belirli sütun adlarına sahip tablolar için bir Oracle veritabanını mı arıyorsunuz?


95

Birçok tablo içeren büyük bir Oracle veritabanımız var. Belirli sütun adlarına sahip herhangi bir tablo olup olmadığını bulmak için sorgulayabileceğim veya arayabileceğim bir yol var mı?

IE bana sütunlara sahip tüm tabloları göster: id, fname, lname, address

Detay Eklemeyi unuttum: Farklı şemalar arasında arama yapabilmeliyim. Bağlanmak için kullanmam gereken, aramam gereken tabloların sahibi değil.

Yanıtlar:


205

Belirli bir sütuna sahip tüm tabloları bulmak için:

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

4 sütundan herhangi birini veya tümünü içeren tabloları bulmak için:

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

Tüm 4 sütunu içeren (hiçbiri eksik olmayan) tabloları bulmak için:

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
Oturum açtığınız kullanıcının bazı tablolara erişimi olmaması durumunda, bu aramayı yapmak için muhtemelen ALL_TAB_COLUMNS yerine DBA_TAB_COLUMNS kullanmalısınız.
Jeffrey Kemp

Doğru, ancak yalnızca bağlı olduğunuz kullanıcı HERHANGİ BİR TABLO SEÇ ayrıcalığına sahipse.
Tony Andrews

2
Tam adından emin değilseniz column_name+ ekleyin like:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

12

Bir sütun adını aramak için, sütun adını doğru biliyorsanız aşağıdaki sorguyu kullanın:

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

Doğru sütunu bilmiyorsanız, bir sütun adını aramak için aşağıda kullanın:

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

10

İstediğiniz veriler "cols" meta veri tablosunda yer alır:

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

Bu size istediğiniz tüm sütunlara sahip tabloların bir listesini verecektir :

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

Bunu farklı bir şemada yapmak için, şemayı aşağıdaki gibi tablonun önünde belirtmeniz yeterlidir.

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

Birçok şemanın aramasını tek bir çıktı sonucu olarak birleştirmek istiyorsanız, bunu yapabilirsiniz:

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

Bunu farklı bir şemaya bakmak için nasıl kullanırım? (Orijinal sorumda bu isteği belirtmeyi unuttum)
David Oneill

Şema adını her tablo adının önüne ekleyin ... yani myschema.c1. Açıkçası, diğer şemada belirli ayrıcalıklara sahip olmalısınız
wadesworld

SELECT * FROM COLSşemamdan hiçbir şey döndürmüyor. Masalarda sadece belirli ayrıcalıklara sahibim. COLS aracılığıyla görüntülememe izin vermek için yeterli olmaz mı?
David Oneill

select * from schema1.colsbana bir table or view does not existhata veriyor . Bunun, ayrıcalıkların nasıl ayarlandığıyla bir ilgisi var mı?
David Oneill

Evet, olurdu. Görünüşe göre Tony Andrew'un cevabı sizin durumunuz için muhtemelen daha iyi. "All_tab_columns" görünümünü unutmuştum.
JosephStyons

0

İşte findcol.sql için kaydettiğimiz bir tanesi, böylece onu SQLPlus içinden kolayca çalıştırabiliriz

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.