2009-12-23 13 views
77

Tenemos una gran base de datos Oracle con muchas tablas. ¿Hay alguna manera de consultar o buscar para encontrar si hay tablas con ciertos nombres de columna?¿Busca en una base de datos Oracle tablas con nombres de columna específicos?

IE me muestran todas las tablas que tienen las columnas: id, fname, lname, address

Detalle me olvidó añadir: Tengo que ser capaz de buscar a través de diferentes esquemas. El que debo usar para conectarme no posee las tablas que necesito buscar.

Respuesta

151

Para encontrar todas las tablas con una columna en particular:

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

Para encontrar tablas que tener alguna o todas las 4 columnas:

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

para encontrar tablas que tienen todas las 4 columnas (con ninguna falta):

select owner, table_name 
from all_tab_columns 
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS') 
group by owner, table_name 
having count(*) = 4; 
+0

¡Gracias, eso fue todo! –

+1

Probablemente debería usar DBA_TAB_COLUMNS en lugar de ALL_TAB_COLUMNS para hacer esta búsqueda, en caso de que el usuario que está iniciando sesión no tenga acceso a algunas tablas. –

+0

Es cierto, pero solo si el usuario al que está conectado tiene el privilegio SELECCIONAR CUALQUIER TABLA. –

9

los datos que desea está en los "cols" tabla de metadatos:

SELECT * FROM COLS WHERE COLUMN_NAME = 'id' 

Ésta le dará una lista de tablas que tienen todo de las columnas que desea:

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

Para hacer esto en un esquema diferente, basta con especificar el esquema en frente de la tabla, como en

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

Si desea combinar las búsquedas de muchos esquemas en un resultado de salida, entonces se podría hacer esto:

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

¿Cómo uso esto para ver un esquema diferente? (Olvidé mencionar que se requiere en mi pregunta original) –

+0

Simplemente anteponga el nombre del esquema al frente de cada nombre de tabla ... es decir. myschema.c1. Obviamente, debe tener privilegios de selección en el otro esquema – wadesworld

+0

'SELECT * FROM COLS' no devuelve nada de mi esquema. Solo tengo privilegios selectos en las tablas. ¿Seleccionaría no ser suficiente para permitirme verlo a través de COLS? –

0

Esta es la que nos hemos ahorrado fuera a findcol.sql para que podamos ejecutar fácilmente desde dentro 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 
8

para buscar un nombre de columna, use la consulta a continuación si se conoce el nombre de la columna con precisión :

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

para buscar un nombre de columna si usted no sabe el uso de columna precisa a continuación:

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

El truco 'upper' es grt. – arun

1

seleccione table_name de dba_tab_columns donde column_name = 'THE_COLUMN_YOU_LOOK_FOR';

Cuestiones relacionadas