sql >> Databáze >  >> RDS >> PostgreSQL

vyloučení duplicitních polí ve spojení

V SQL neexistuje žádná syntaxe vyloučení sloupců, existuje pouze syntaxe zahrnutí sloupců (prostřednictvím operátoru * pro všechny sloupce nebo explicitním uvedením názvů sloupců).

Vygenerujte seznam pouze požadovaných sloupců

Můžete však vygenerovat příkaz SQL se stovkami názvů sloupců, mínus pár duplicitních sloupců, které nechcete, pomocí tabulek schémat a některých vestavěných funkcí vaší databáze.

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

Tím se výpis pouze vytiskne, neprovede se. Pak už jen zkopírujete výsledek a spustíte jej.

Pokud chcete příkaz generovat a spouštět dynamicky najednou, můžete si přečíst o tom, jak spustit dynamický SQL v Dokumentace PostgreSQL .

Před názvy sloupců uveďte název tabulky

Alternativně se tím vygeneruje výběrový seznam všech sloupců, včetně těch s duplicitními daty, ale pak jim vytvoří alias tak, aby obsahoval i název tabulky každého sloupce.

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

Opět to pouze vygeneruje prohlášení. Pokud chcete příkaz generovat i spouštět dynamicky, budete muset oprášit dynamické provádění SQL pro vaši databázi, jinak stačí zkopírovat a spustit výsledek.

Pokud opravdu chcete v aliasech sloupců oddělovač teček, budete muset použít aliasy s dvojitými uvozovkami, jako je SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Aliasy v uvozovkách však mohou způsobit další komplikace (rozlišování malých a velkých písmen atd.); takže jsem místo toho použil znak podtržítka k oddělení názvu tabulky od názvu sloupce v rámci aliasu a s aliasy pak lze zacházet jako s běžnými názvy sloupců jinak.




  1. Apache 2.4 s PHP 5.4:není k dispozici žádný mysql

  2. Oracle na PostgreSQL:ZAČNĚTE S / PŘIPOJTE SE

  3. Kód chyby:1055 nekompatibilní s sql_mode=only_full_group_by

  4. Jak získat století z data v Oracle