Como escrever uma consulta para localizar todas as tabelas em um banco de dados que tenham um nome de coluna específico

12

Eu tenho um banco de dados com cerca de 100 tabelas e preciso criar uma consulta de junção para obter dados específicos de duas delas. Eu conheço um, mas não o outro. Basicamente, preciso de algo como:

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

Como posso fazer isso?

Joe Essey
fonte
6
Minha resposta assumiu o SQL Server. É com esse RDBMS que você está trabalhando?
Thomas Stringer

Respostas:

21

Usando information_schema

Essa é a maneira entre RDBMS compatível com os padrões.

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

Você pode ver isso documentado

SqlSandwiches
fonte
5
Por que não usar INFORMATION_SCHEMA, pelo nosso próprio @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/... )
Thomas Stringer
2
@ThomasStringer Concordo, mas o OP não marcou a pergunta com nenhuma tag dbms.
ypercubeᵀᴹ
@ThomasStringer Use um banco de dados real, logo de cara o PostgreSQL suporta Identity Columns information_schema.columnsdesde 2006. Uma década antes de implementá-los. Se o Microsoft SQL não suporta o padrão, talvez devêssemos procurá-lo. Outros fazem.
Evan Carroll
5

Para o IBM DB2, você usaria o seguinte:

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

Observe que, no DB2, os nomes das colunas estarão em maiúsculas, a menos que tenham sido definidos dentro de aspas duplas com algo diferente de maiúsculas. Então você também deve fornecer a caixa exata do nome da coluna.

Chris Aldrich
fonte
11
Se a coluna onde definido o uso de aspas (que devem ser evitados), você pode usar a função UPPER ou UCASE para transformar o colname para maiúsculas: WHERE UPPER(colname) = 'COLUMN_NAME'.
Lennart
3

A consulta abaixo deve fornecer o que você está procurando:

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

Se você estiver procurando colunas com um nome exato, substitua a WHEREcláusula por:

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

em 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.
fonte
0

SQL sql / plsql:

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

Por favor, passe o nome da coluna para esta variável: $COLUMN_NAME

Yasim
fonte
-3

// Selecione a tabela Particular:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;
selvi
fonte
Você provavelmente interpretou mal a pergunta do OP, sua resposta não responde à pergunta que foi feita.
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
fonte