So schreiben Sie eine Abfrage, um alle Tabellen in einer Datenbank zu finden, die einen bestimmten Spaltennamen haben

10

Ich habe eine Datenbank mit ungefähr 100 Tabellen und muss eine Verknüpfungsabfrage erstellen, um bestimmte Daten von zwei davon abzurufen. Ich kenne den einen, aber nicht den anderen. Grundsätzlich brauche ich so etwas wie:

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

Wie kann ich das machen?

Joe Essey
quelle
6
Meine Antwort ging von SQL Server aus. Ist das das RDBMS, mit dem Sie arbeiten?
Thomas Stringer

Antworten:

19

Verwenden von information_schema

Dies ist die standardkonforme Cross-RDBMS-Methode.

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

Sie können dies dokumentiert sehen

SqlSandwiches
quelle
5
Warum nicht INFORMATION_SCHEMAvon unserem eigenen @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/… )
Thomas Stringer
2
@ThomasStringer Ich stimme zu, aber das OP hat die Frage nicht mit einem DBMS-Tag versehen.
Ypercubeᵀᴹ
@ThomasStringer Verwenden Sie eine echte Datenbank auf Anhieb PostgreSQL unterstützt information_schema.columnsseit 2006 Identitätsspalten . Ein ganzes Jahrzehnt, bevor sie überhaupt implementiert wurden. Wenn Microsoft SQL den Standard nicht unterstützt, sollten wir vielleicht versuchen, sie zu nerven. Andere tun es.
Evan Carroll
5

Für IBM DB2 würden Sie Folgendes verwenden:

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

Beachten Sie, dass in DB2 Spaltennamen in Großbuchstaben geschrieben werden, es sei denn, sie wurden in doppelten Anführungszeichen mit etwas anderem als Großbuchstaben definiert. Dann müssen Sie auch das genaue Gehäuse des Spaltennamens angeben.

Chris Aldrich
quelle
1
Wenn die Spalte mit Anführungszeichen definiert wurde (was vermieden werden sollte), können Sie die UPPER- oder UCASE-Funktion verwenden, um den Spaltennamen in Großbuchstaben umzuwandeln : WHERE UPPER(colname) = 'COLUMN_NAME'.
Lennart
3

Die folgende Abfrage sollte Ihnen das geben, wonach Sie suchen:

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

Wenn Sie nach Spalten mit genauem Namen suchen, ersetzen Sie die WHEREKlausel einfach durch :

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

in 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.
quelle
0

Oracle sql / plsql:

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

Bitte übergeben Sie den Spaltennamen an diese Variable: $COLUMN_NAME

Yasim
quelle
-3

// Wählen Sie die bestimmte Tabelle aus:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;
selvi
quelle
Sie haben die Frage des OP wahrscheinlich falsch verstanden. Ihre Antwort beantwortet nicht die gestellte Frage.
Lennart
-3

Für SQL Server:

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