Der er ingen kolonneekskluderingssyntaks i SQL, der er kun kolonneinkluderingssyntaks (via *-operatoren for alle kolonner, eller eksplicit angiver kolonnenavnene).
Generer en liste over kun ønskede kolonner
Du kan dog generere SQL-sætningen med dens hundredvis af kolonnenavne, minus de få duplikerede kolonner, du ikke ønsker, ved hjælp af skematabeller og nogle indbyggede funktioner i din database.
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
Dette udskriver kun erklæringen, den udfører den ikke. Så kopierer du bare resultatet og kører det.
Hvis du både vil generere og køre sætningen dynamisk på én gang, så kan du læse om, hvordan du kører dynamisk SQL i PostgreSQL-dokumentation .
Sæt kolonnenavne foran med tabelnavn
Alternativt genererer dette en udvalgt liste over alle kolonnerne, inklusive dem med duplikerede data, men kalder dem derefter for også at inkludere tabelnavnet for hver kolonne.
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
Igen genererer dette kun erklæringen. Hvis du både vil generere og køre sætningen dynamisk, så skal du friske op på dynamisk SQL-udførelse for din database, ellers skal du bare kopiere og køre resultatet.
Hvis du virkelig vil have en punktseparator i kolonnealiasserne, skal du bruge aliaser med dobbelte anførselstegn såsom SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"'
. Dog kan dobbelt-citerede aliaser forårsage ekstra komplikationer (case-sensitivitet osv.); så jeg brugte understregningstegnet i stedet for at adskille tabelnavnet fra kolonnenavnet i aliasset, og aliasserne kan så behandles som almindelige kolonnenavne ellers.