PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

изключване на дублирани полета в съединение

В SQL няма синтаксис за изключване на колони, има само синтаксис за включване на колони (чрез оператора * за всички колони или изрично изброяване на имената на колоните).

Генерирайте списък само с колони, които желаете

Можете обаче да генерирате SQL израза със стотиците му имена на колони, минус няколкото дублирани колони, които не желаете, като използвате таблици със схеми и някои вградени функции на вашата база данни.

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

Това само отпечатва оператора, не го изпълнява. След това просто копирате резултата и го стартирате.

Ако искате едновременно да генерирате и изпълните оператора динамично наведнъж, можете да прочетете как да стартирате динамичен SQL в Документация на PostgreSQL .

Добавяне на имена на колони с име на таблица

Като алтернатива, това генерира списък за избор на всички колони, включително тези с дублирани данни, но след това им създава псевдоними, за да включва и името на таблицата на всяка колона.

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

Отново, това само генерира изявлението. Ако искате както да генерирате, така и да изпълните оператора динамично, тогава ще трябва да освежите динамичното изпълнение на SQL за вашата база данни, в противен случай просто копирайте и стартирайте резултата.

Ако наистина искате разделител точка в псевдонимите на колоните, тогава ще трябва да използвате псевдоними в двойни кавички, като например SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Псевдонимите в двойни кавички обаче могат да причинят допълнителни усложнения (чувствителност към главни и малки букви и т.н.); така че вместо това използвах знака за долна черта, за да отделя името на таблицата от името на колоната в псевдонима и псевдонимите могат да бъдат третирани като обикновени имена на колони иначе.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql - групиране по в диапазони, за да включите диапазони без стойности

  2. Компилиране на PL/Proxy с PostgresPlus Advance Server 9.1

  3. ALTER заявката е много бавна на малка таблица в PostgreSQL

  4. Вземете всички процедурни, дефинирани от потребителя функции

  5. използвайки копие в postgresql?