ค้นหาฐานข้อมูล Oracle สำหรับตารางที่มีชื่อคอลัมน์เฉพาะหรือไม่


95

เรามีฐานข้อมูล Oracle ขนาดใหญ่พร้อมตารางจำนวนมาก มีวิธีที่ฉันสามารถสอบถามหรือค้นหาเพื่อดูว่ามีตารางที่มีชื่อคอลัมน์บางตารางหรือไม่

IE แสดงตารางทั้งหมดที่มีคอลัมน์: id, fname, lname, address

รายละเอียดฉันลืมเพิ่ม: ฉันต้องสามารถค้นหาผ่านสคีมาต่างๆได้ สิ่งที่ฉันต้องใช้เพื่อเชื่อมต่อไม่ได้เป็นเจ้าของตารางที่ฉันต้องค้นหา

คำตอบ:


205

หากต้องการค้นหาตารางทั้งหมดที่มีคอลัมน์เฉพาะ:

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
คุณควรใช้ DBA_TAB_COLUMNS แทน ALL_TAB_COLUMNS ในการค้นหานี้ในกรณีที่ผู้ใช้ที่คุณเข้าสู่ระบบเนื่องจากไม่มีสิทธิ์เข้าถึงบางตาราง
Jeffrey Kemp

จริง แต่เฉพาะในกรณีที่ผู้ใช้ที่คุณเชื่อมต่อเนื่องจากมีสิทธิ์เลือกตารางใดก็ได้
Tony Andrews

2
เพิ่มcolumn_name+ likeหากคุณไม่แน่ใจชื่อที่แน่นอน:select owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

12

ในการค้นหาชื่อคอลัมน์ให้ใช้ข้อความค้นหาด้านล่างหากคุณทราบชื่อคอลัมน์อย่างถูกต้อง:

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

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

หากคุณต้องการรวมการค้นหาสคีมาจำนวนมากเป็นผลลัพธ์ผลลัพธ์เดียวคุณสามารถทำได้:

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

ฉันจะใช้สิ่งนี้เพื่อดูสคีมาอื่นได้อย่างไร (ฉันลืมพูดถึงคำถามนั้นในคำถามเดิมของฉัน)
David Oneill

เพียงนำหน้าชื่อสคีมาที่ด้านหน้าของชื่อตารางแต่ละชื่อ ... เช่น myschema.c1 เห็นได้ชัดว่าคุณต้องมีสิทธิ์เลือกในแผนอื่น
wadesworld

SELECT * FROM COLSไม่ส่งคืนอะไรจากสคีมาของฉัน ฉันมีสิทธิ์เลือกเฉพาะบนโต๊ะเท่านั้น การเลือกจะไม่เพียงพอที่จะให้ฉันดูผ่าน COLS หรือไม่
David Oneill

select * from schema1.colsทำให้ฉันมีtable or view does not existข้อผิดพลาด จะต้องเกี่ยวข้องกับวิธีการตั้งค่าสิทธิพิเศษหรือไม่?
David Oneill

ใช่มันจะ. ดูเหมือนว่าคำตอบของ Tony Andrew น่าจะดีกว่าสำหรับสถานการณ์ของคุณ ฉันลืมเกี่ยวกับมุมมอง "all_tab_columns" ไปแล้ว
JosephStyons

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.