sql >> Databasteknik >  >> RDS >> PostgreSQL

exklusive dubbletter av fält i en koppling

Det finns ingen uteslutningssyntax för kolumner i SQL, det finns bara syntax för kolumninkludering (via *-operatorn för alla kolumner, eller explicit lista kolumnnamnen).

Skapa en lista över endast kolumner du vill ha

Du kan dock generera SQL-satsen med dess hundratals kolumnnamn, minus de få dubbletter av kolumner du inte vill ha, med hjälp av schematabeller och några inbyggda funktioner i din databas.

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

Detta skriver bara ut uttalandet, det kör det inte. Sedan kopierar du bara resultatet och kör det.

Om du vill både generera och köra satsen dynamiskt på en gång kan du läsa om hur du kör dynamisk SQL i PostgreSQL-dokumentation .

Föregå kolumnnamn med tabellnamn

Alternativt genererar detta en urvalslista över alla kolumner, inklusive de med dubbletter av data, men sedan alias dem för att inkludera tabellnamnet för varje kolumn också.

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

Återigen, detta genererar bara uttalandet. Om du vill både generera och köra satsen dynamiskt, måste du fräscha upp dynamisk SQL-körning för din databas, annars är det bara att kopiera och köra resultatet.

Om du verkligen vill ha en punktavgränsare i kolumnaliasen, måste du använda alias med dubbla citationstecken som t.ex. SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Dock kan alias med dubbla citattecken orsaka extra komplikationer (skiftlägeskänslighet, etc); så jag använde understreckstecknet istället för att separera tabellnamnet från kolumnnamnet i aliaset, och aliasen kan då behandlas som vanliga kolumnnamn annars.




  1. Få poster baserade på kolumns maxvärde

  2. Lagra flera e-postadresser i databasen för olika användartyper

  3. Spring JDBC - Senast infogade id

  4. Använd tnsnames.ora i Oracle SQL Developer