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
これはステートメントを出力するだけで、実行はしません。次に、結果をコピーして実行します。
ステートメントの生成と動的な実行の両方を一度に実行したい場合は、PostgreSQLのドキュメントで動的SQLを実行する方法を確認できます。
列名の前にテーブル名を付ける
または、重複データを含むすべての列の選択リストを生成しますが、各列のテーブル名も含めるようにエイリアスを作成します。
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 || '"'
。ただし、二重引用符で囲まれたエイリアスは、余分な問題(大文字と小文字の区別など)を引き起こす可能性があります。そのため、代わりにアンダースコア文字を使用して、エイリアス内の列名からテーブル名を分離しました。そうしないと、エイリアスを通常の列名のように扱うことができます。