Jak napisać zapytanie, aby znaleźć wszystkie tabele w bazie danych o określonej nazwie kolumny

12

Mam bazę danych z około 100 tabelami i muszę zbudować kwerendę łączenia, aby uzyskać określone dane z dwóch z nich. Znam jedno, ale nie drugie. Zasadniczo potrzebuję czegoś takiego:

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

W jaki sposób mogę to zrobić?

Joe Essey
źródło
6
Moja odpowiedź zakładała, że ​​SQL Server. Czy to RDBMS, z którym pracujesz?
Thomas Stringer

Odpowiedzi:

21

Za pomocą information_schema

Jest to zgodny ze standardami sposób realizacji tego zadania w wielu systemach RDBMS.

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

Możesz to zobaczyć udokumentowane

SqlSandwiches
źródło
5
Dlaczego nie skorzystać INFORMATION_SCHEMAz naszego własnego @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/… )
Thomas Stringer
2
@ThomasStringer Zgadzam się, ale OP nie oznaczył pytania żadnym znacznikiem dbms.
ypercubeᵀᴹ
@ThomasStringer Używaj prawdziwej bazy danych, od samego początku PostgreSQL obsługuje kolumny tożsamości information_schema.columnsod 2006 roku. Pełna dekada, zanim jeszcze je zaimplementowano. Jeśli Microsoft SQL nie obsługuje standardu, być może powinniśmy zastanowić się nad ich dokuczaniem. Inni tak.
Evan Carroll
5

W przypadku IBM DB2 użyłbyś:

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

Zauważ, że w DB2 nazwy kolumn będą pisane wielkimi literami, chyba że zostały zdefiniowane w podwójnych cudzysłowach za pomocą czegoś innego niż wielkie litery. Następnie musisz podać również dokładną nazwę kolumny.

Chris Aldrich
źródło
1
Jeśli w kolumnie, w której zdefiniowane za pomocą cytatów (które powinny być wykluczone), można użyć funkcji górnej lub UCase przekształcić colname do wielkimi literami: WHERE UPPER(colname) = 'COLUMN_NAME'.
Lennart
3

Poniższe zapytanie powinno dać ci to, czego szukasz:

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

Jeśli szukasz kolumn o dokładnej nazwie, po prostu zamień WHEREklauzulę na:

where c.name = 'ColumnSearchText';
Thomas Stringer
źródło
0

w 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.
źródło
0

Oracle sql / plsql:

select table_name from all_tab_columns where column_name='yourcolumnname';
Tim Chaubet
źródło
0
SELECT * FROM _v_sys_columns WHERE COLUMN_NAME='$COLUMN_NAME'

Prześlij nazwę kolumny do tej zmiennej: $COLUMN_NAME

Yasim
źródło
-3

// Wybierz konkretną tabelę:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;
selvi
źródło
Prawdopodobnie źle odczytałeś pytanie PO, twoja odpowiedź nie odpowiada na zadane pytanie.
Lennart
-3

W przypadku programu SQL Server:

SELECT name 
FROM sysobjects 
WHERE id IN 
( 
    SELECT id 
    FROM syscolumns 
    WHERE name = 'EXACT_COLUMN_NAME_TO_SEARCH'
)
Rama Rao
źródło