sql >> Database teknologi >  >> RDS >> PostgreSQL

undtagen duplikerede felter i en joinforbindelse

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.




  1. SQL:valg af rækker, hvor kolonneværdien er ændret fra forrige række

  2. Sådan dropper du database ved at bruge TSQL og GUI - SQL Server / TSQL Tutorial Del 25

  3. Sådan opretter du en dato i SQL Server givet dag, måned og år som heltal

  4. Hvad er forskellen mellem NOT condition og NOT() i Oracle og MS SQL Server