В 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 || '"'
. Псевдонимите в двойни кавички обаче могат да причинят допълнителни усложнения (чувствителност към главни и малки букви и т.н.); така че вместо това използвах знака за долна черта, за да отделя името на таблицата от името на колоната в псевдонима и псевдонимите могат да бъдат третирани като обикновени имена на колони иначе.