Cómo escribir una consulta para encontrar todas las tablas en una base de datos que tienen un nombre de columna específico

12

Tengo una base de datos con aproximadamente 100 tablas y necesito crear una consulta de unión para obtener datos específicos de dos de ellas. Conozco uno pero no el otro. Básicamente necesito algo como:

select <tables> from <database> where exists table.column name;

¿Cómo puedo hacer esto?

Joe Essey
fuente
66
Mi respuesta asumió SQL Server. ¿Es ese el RDBMS con el que está trabajando?
Thomas Stringer

Respuestas:

21

Utilizando information_schema

Esta es la forma cruzada de RDBMS compatible con los estándares para hacerlo.

SELECT table_catalog, table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.columns
WHERE column_name = '<your column name>';

Puedes ver esto documentado

SqlSandwiches
fuente
55
¿Por qué no usar INFORMATION_SCHEMA, por nuestro propio @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/… )
Thomas Stringer
2
@ThomasStringer Estoy de acuerdo, pero el OP no ha etiquetado la pregunta con ninguna etiqueta dbms.
ypercubeᵀᴹ
@ThomasStringer Utilice una base de datos real, desde el principio PostgreSQL ha admitido Columnas de Identidad information_schema.columnsdesde 2006. Una década completa incluso antes de implementarlas. Si Microsoft SQL no es compatible con el estándar, quizás deberíamos considerar molestarlos. Otros lo hacen
Evan Carroll
5

Para IBM DB2, usaría lo siguiente:

select tabschema,tabname from syscat.columns where colname = 'COLUMN_NAME'

Tenga en cuenta que en DB2, los nombres de las columnas estarán en mayúsculas a menos que se definan dentro de comillas dobles con algo distinto de mayúsculas. Luego, también debe proporcionar la carcasa exacta del nombre de la columna.

Chris Aldrich
fuente
1
Si la columna en la que se define el uso de citas (que deben evitarse), puede utilizar la función UPPER o UCASE para transformar el nomCol a mayúsculas: WHERE UPPER(colname) = 'COLUMN_NAME'.
Lennart
3

La siguiente consulta debería darle lo que está buscando:

use YourDatabase;
go

select
    object_schema_name(t.object_id) + '.' + t.name as table_name,
    c.name as column_name
from sys.tables t
inner join sys.columns c
on t.object_id = c.object_id
where c.name like '%ColumnSearchText%';

Si está buscando columnas con un nombre exacto, simplemente reemplace la WHEREcláusula con:

where c.name = 'ColumnSearchText';
Thomas Stringer
fuente
0

en Teradata 15:

SELECT DATABASENAME||'.'||TABLENAME AS FULL_TABLENAME,
COUNT(1) AS NUMBER_OF_COLUMNS
FROM DBC.COLUMNSV
WHERE 1 = 1
AND COLUMNNAME LIKE '%<YOUR COLUMNNAME HERE>%'
GROUP BY 1
Boris N.
fuente
0

Oracle sql / plsql:

select table_name from all_tab_columns where column_name='yourcolumnname';
Tim Chaubet
fuente
0
SELECT * FROM _v_sys_columns WHERE COLUMN_NAME='$COLUMN_NAME'

Pase el nombre de la columna a esta variable: $COLUMN_NAME

Yasim
fuente
-3

// Seleccione la tabla Particular:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;
selvi
fuente
Probablemente leyó mal la pregunta del OP, su respuesta no responde la pregunta que se le hizo.
Lennart
-3

Para SQL Server:

SELECT name 
FROM sysobjects 
WHERE id IN 
( 
    SELECT id 
    FROM syscolumns 
    WHERE name = 'EXACT_COLUMN_NAME_TO_SEARCH'
)
Rama Rao
fuente