PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

exclusion des champs en double dans une jointure

Il n'y a pas de syntaxe d'exclusion de colonne dans SQL, il n'y a qu'une syntaxe d'inclusion de colonne (via l'opérateur * pour toutes les colonnes, ou en listant explicitement les noms de colonne).

Générer une liste des seules colonnes souhaitées

Cependant, vous pouvez générer l'instruction SQL avec ses centaines de noms de colonnes, moins les quelques colonnes en double que vous ne voulez pas, en utilisant des tables de schéma et certaines fonctions intégrées de votre base de données.

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

Cela imprime uniquement l'instruction, il ne l'exécute pas. Ensuite, il vous suffit de copier le résultat et de l'exécuter.

Si vous souhaitez à la fois générer et exécuter l'instruction dynamiquement en une seule fois, vous pouvez lire comment exécuter SQL dynamique dans le Documentation PostgreSQL .

Ajouter les noms de colonne au nom de table

Alternativement, cela génère une liste de sélection de toutes les colonnes, y compris celles avec des données en double, mais les alias ensuite pour inclure également le nom de table de chaque colonne.

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

Encore une fois, cela ne génère que la déclaration. Si vous souhaitez à la fois générer et exécuter l'instruction de manière dynamique, vous devrez approfondir l'exécution SQL dynamique pour votre base de données, sinon copiez et exécutez simplement le résultat.

Si vous voulez vraiment un séparateur de points dans les alias de colonne, vous devrez utiliser des alias entre guillemets tels que SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Cependant, les alias entre guillemets doubles peuvent entraîner des complications supplémentaires (sensibilité à la casse, etc.) ; donc, j'ai utilisé le caractère de soulignement à la place pour séparer le nom de la table du nom de la colonne dans l'alias, et les alias peuvent alors être traités comme des noms de colonne normaux autrement.