PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ausschließen doppelter Felder in einem Join

Es gibt keine Spaltenausschlusssyntax in SQL, es gibt nur eine Spalteneinschlusssyntax (über den *-Operator für alle Spalten oder explizites Auflisten der Spaltennamen).

Generieren Sie eine Liste nur der gewünschten Spalten

Sie könnten jedoch die SQL-Anweisung mit ihren Hunderten von Spaltennamen, abzüglich der wenigen doppelten Spalten, die Sie nicht möchten, mithilfe von Schematabellen und einigen integrierten Funktionen Ihrer Datenbank generieren.

SELECT
    'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
        SELECT 'demographics' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'demographics' 
        AND column_name NOT IN ('zip')
        UNION ALL
        SELECT 'community' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'community' 
        AND column_name NOT IN ('fips')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

Dadurch wird die Anweisung nur ausgedruckt, nicht ausgeführt. Dann kopieren Sie einfach das Ergebnis und führen es aus.

Wenn Sie die Anweisung auf einmal dynamisch generieren und ausführen möchten, können Sie im PostgreSQL-Dokumentation .

Spaltennamen dem Tabellennamen voranstellen

Alternativ generiert dies eine Auswahlliste aller Spalten, einschließlich derjenigen mit doppelten Daten, aber aliasiert sie dann so, dass sie auch den Tabellennamen jeder Spalte enthält.

SELECT
    'SELECT ' || ARRAY_TO_STRING(ARRAY(
        SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
        FROM information_schema.columns
        WHERE table_name in ('sampledata', 'demographics', 'community')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

Auch hier wird nur die Anweisung generiert. Wenn Sie die Anweisung sowohl dynamisch generieren als auch ausführen möchten, müssen Sie die dynamische SQL-Ausführung für Ihre Datenbank aufpolieren, andernfalls kopieren Sie einfach das Ergebnis und führen es aus.

Wenn Sie wirklich ein Punkttrennzeichen in den Spaltenaliasen wollen, müssen Sie Aliase in doppelten Anführungszeichen wie SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Aliase in doppelten Anführungszeichen können jedoch zusätzliche Komplikationen verursachen (Groß- und Kleinschreibung usw.); Daher habe ich stattdessen den Unterstrich verwendet, um den Tabellennamen vom Spaltennamen innerhalb des Alias ​​zu trennen, und die Aliase können dann ansonsten wie reguläre Spaltennamen behandelt werden.