sql >> Database >  >> RDS >> PostgreSQL

dubbele velden in een join uitsluiten

Er is geen syntaxis voor het uitsluiten van kolommen in SQL, er is alleen een syntaxis voor het opnemen van kolommen (via de * operator voor alle kolommen, of de kolomnamen expliciet vermelden).

Genereer een lijst met alleen kolommen die u wilt

U kunt echter de SQL-instructie met zijn honderden kolomnamen genereren, minus de paar dubbele kolommen die u niet wilt, met behulp van schematabellen en enkele ingebouwde functies van uw 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

Dit drukt alleen het statement af, het voert het niet uit. Vervolgens kopieer je het resultaat en voer je het uit.

Als u de instructie in één keer dynamisch wilt genereren en uitvoeren, kunt u lezen hoe u dynamische SQL uitvoert in de PostgreSQL-documentatie .

Kolomnamen voorzetten met tabelnaam

Als alternatief genereert dit een selectielijst van alle kolommen, inclusief die met dubbele gegevens, maar voegt deze vervolgens toe aan een alias om ook de tabelnaam van elke kolom op te nemen.

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

Nogmaals, dit genereert alleen de verklaring. Als u de instructie zowel dynamisch wilt genereren als uitvoeren, moet u de dynamische SQL-uitvoering voor uw database oppoetsen, anders kopieert u het resultaat en voert u het uit.

Als je echt een puntscheider in de kolomaliassen wilt, dan moet je dubbele aanhalingstekens gebruiken, zoals SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Dubbel geciteerde aliassen kunnen echter extra complicaties veroorzaken (hoofdlettergevoeligheid, enz.); dus heb ik in plaats daarvan het onderstrepingsteken gebruikt om de tabelnaam te scheiden van de kolomnaam binnen de alias, en de aliassen kunnen dan anders worden behandeld als gewone kolomnamen.




  1. Ontvang records die het dichtst bij een specifieke datum liggen, gegroepeerd op type

  2. De stille modus inschakelen voor Postgres-opdrachten op Heroku

  3. Postgresql krijgt de eerste en laatste dag van alle iso-week in een bepaald jaar

  4. MySql-weergaven prestaties