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

esclusi i campi duplicati in un join

Non esiste una sintassi di esclusione delle colonne in SQL, esiste solo la sintassi di inclusione delle colonne (tramite l'operatore * per tutte le colonne o elencando esplicitamente i nomi delle colonne).

Genera l'elenco delle sole colonne desiderate

Tuttavia, puoi generare l'istruzione SQL con le sue centinaia di nomi di colonne, meno le poche colonne duplicate che non desideri, utilizzando tabelle di schema e alcune funzioni integrate nel tuo 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

Questo stampa solo l'istruzione, non la esegue. Quindi copia il risultato ed eseguilo.

Se desideri generare ed eseguire l'istruzione in modo dinamico in una volta sola, puoi leggere come eseguire SQL dinamico in Documentazione PostgreSQL .

Anteponi i nomi delle colonne al nome della tabella

In alternativa, questo genera un elenco selezionato di tutte le colonne, comprese quelle con dati duplicati, ma poi le alias per includere anche il nome della tabella di ciascuna colonna.

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

Ancora una volta, questo genera solo la dichiarazione. Se desideri generare ed eseguire l'istruzione in modo dinamico, dovrai rispolverare l'esecuzione SQL dinamica per il tuo database, altrimenti copia ed esegui il risultato.

Se vuoi davvero un separatore di punti negli alias di colonna, dovrai usare alias con virgolette doppie come SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Tuttavia, gli alias con virgolette doppie possono causare complicazioni aggiuntive (sensibilità al maiuscolo/minuscolo, ecc.); quindi, ho usato il carattere di sottolineatura invece per separare il nome della tabella dal nome della colonna all'interno dell'alias, e gli alias possono quindi essere trattati come normali nomi di colonna altrimenti.