Tìm kiếm cơ sở dữ liệu Oracle cho các bảng có tên cột cụ thể?


94

Chúng tôi có một cơ sở dữ liệu Oracle lớn với nhiều bảng. Có cách nào tôi có thể truy vấn hoặc tìm kiếm để tìm xem có bảng nào có tên cột nhất định không?

IE hiển thị cho tôi tất cả các bảng có các cột: id, fname, lname, address

Chi tiết tôi quên bổ sung: Tôi cần có thể tìm kiếm thông qua các lược đồ khác nhau. Cái tôi phải sử dụng để kết nối không sở hữu các bảng tôi cần tìm kiếm.

Câu trả lời:


198

Để tìm tất cả các bảng có một cột cụ thể:

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

Để tìm bảng có bất kỳ hoặc tất cả 4 cột:

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

Để tìm bảng có tất cả 4 cột (không có cột nào bị thiếu):

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
Bạn có thể nên sử dụng DBA_TAB_COLUMNS thay vì ALL_TAB_COLUMNS để thực hiện tìm kiếm này, trong trường hợp người dùng bạn đang đăng nhập không có quyền truy cập vào một số bảng.
Jeffrey Kemp

Đúng, nhưng chỉ khi người dùng mà bạn kết nối có đặc quyền CHỌN BẤT KỲ BẢNG.
Tony Andrews

2
Thêm column_name+ likenếu bạn không chắc về tên chính xác:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

10

Dữ liệu bạn muốn nằm trong bảng siêu dữ liệu "cols":

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'

Cái này sẽ cung cấp cho bạn danh sách các bảng có tất cả các cột bạn muốn:

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

Để thực hiện việc này trong một lược đồ khác, chỉ cần chỉ định lược đồ trước bảng, như trong

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

Nếu bạn muốn kết hợp các tìm kiếm của nhiều lược đồ thành một kết quả đầu ra, thì bạn có thể làm như sau:

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

Làm cách nào để sử dụng cái này để xem một lược đồ khác? (Tôi quên kể rằng req trong câu hỏi ban đầu của tôi)
David Oneill

Chỉ cần thêm tên lược đồ vào đầu mỗi tên bảng ... tức là myschema.c1. Rõ ràng bạn phải có các đặc quyền chọn lọc trên schem khác
wadesworld

SELECT * FROM COLSkhông trả về gì từ giản đồ của tôi. Tôi chỉ có một số đặc quyền trên các bảng. Chọn không đủ để cho phép tôi xem nó qua COLS?
David Oneill

select * from schema1.colscho tôi một table or view does not existlỗi. Điều đó có liên quan đến cách thiết lập các đặc quyền không?
David Oneill

Có, nó sẽ. Có vẻ như câu trả lời của Tony Andrew có lẽ tốt hơn cho tình huống của bạn. Tôi đã quên về chế độ xem "all_tab_columns".
JosephStyons

10

ĐỂ tìm kiếm tên cột, hãy sử dụng truy vấn dưới đây nếu bạn biết chính xác tên cột:

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

ĐỂ tìm kiếm tên cột nếu bạn không biết cách sử dụng cột chính xác bên dưới:

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

0

Đây là một cái mà chúng tôi đã lưu vào findcol.sql để chúng tôi có thể chạy nó dễ dàng từ bên trong 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.