特定の列名を持つテーブルを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
ログインしているユーザーが一部のテーブルにアクセスできない場合に備えて、この検索を行うにはALL_TAB_COLUMNSではなくDBA_TAB_COLUMNSを使用する必要があります。
ジェフリーケンプ、

True、ただし接続しているユーザーにSELECT ANY TABLE権限がある場合のみ。
Tony Andrews、

2
追加column_name+ like:あなたは必ず正確な名前のいないのであればselect owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
マイク・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%';

多くのスキーマの検索を1つの出力結果に結合したい場合は、次のようにします。

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

これを使用して別のスキーマを確認するにはどうすればよいですか?(私は私の元の質問でそのreqを言及するのを忘れていました)
David Oneill

各テーブル名の前にスキーマ名を追加するだけです...つまり、myschema.c1。明らかに、他のスキーマに対する選択権限が必要です
wadesworld

SELECT * FROM COLS私のスキーマから何も返しません。テーブルに対する選択権限しかありません。COLSで表示するには、選択だけでは不十分ですか?
David Oneill、2009

select * from schema1.cols私に与えますtable or view does not existエラーを。権限の設定方法と関係があるのでしょうか?
David Oneill、2009

はい、そうです。トニー・アンドリューの答えはおそらくあなたの状況にとってより良いようです。「all_tab_columns」ビューを忘れていました。
JosephStyons 2009

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.