Comment écrire une requête pour rechercher toutes les tables dans une base de données qui ont un nom de colonne spécifique

12

J'ai une base de données avec environ 100 tables et j'ai besoin de construire une requête de jointure pour obtenir des données spécifiques de deux d'entre elles. Je connais l'un mais pas l'autre. Fondamentalement, j'ai besoin de quelque chose comme:

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

Comment puis-je faire ceci?

Joe Essey
la source
6
Ma réponse supposait SQL Server. Est-ce le SGBDR avec lequel vous travaillez?
Thomas Stringer

Réponses:

21

En utilisant information_schema

Il s'agit de la manière de se conformer au SGBDR croisé conforme aux normes.

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

Vous pouvez voir cela documenté

SqlSandwiches
la source
5
Pourquoi ne pas utiliser INFORMATION_SCHEMA, par notre propre @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/… )
Thomas Stringer
2
@ThomasStringer Je suis d'accord mais l'OP n'a marqué la question avec aucune balise dbms.
ypercubeᵀᴹ
@ThomasStringer Utilisez une vraie base de données, dès le départ PostgreSQL supporte les colonnes d'identité information_schema.columnsdepuis 2006. Une décennie entière avant même de les implémenter. Si Microsoft SQL ne prend pas en charge la norme, nous devrions peut-être envisager de les harceler. D'autres le font.
Evan Carroll
5

Pour IBM DB2, vous utiliseriez les éléments suivants:

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

Notez que dans DB2, les noms de colonnes seront en majuscules, sauf s'ils ont été définis à l'intérieur de guillemets doubles avec autre chose que des majuscules. Ensuite, vous devez également fournir le boîtier exact du nom de la colonne.

Chris Aldrich
la source
1
Si la colonne dans laquelle définie à l' aide des guillemets (qui devrait être évitée), vous pouvez utiliser la fonction UPPER ou UCASE pour transformer le colname en majuscules: WHERE UPPER(colname) = 'COLUMN_NAME'.
Lennart
3

La requête ci-dessous devrait vous donner ce que vous recherchez:

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 vous recherchez des colonnes d'un nom exact, remplacez simplement la WHEREclause par:

where c.name = 'ColumnSearchText';
Thomas Stringer
la source
0

dans 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.
la source
0

Oracle sql / plsql:

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

Veuillez transmettre le nom de la colonne à cette variable: $COLUMN_NAME

Yasim
la source
-3

// Sélectionnez la table particulière:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;
selvi
la source
Vous avez probablement mal lu la question du PO, votre réponse ne répond pas à la question qui a été posée.
Lennart
-3

Pour SQL Server:

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