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ドキュメント 。
列名にテーブル名を付加する
または、重複データを含むすべての列の選択リストを生成しますが、各列のテーブル名も含めるようにエイリアスを作成します。
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 || '"'
。ただし、二重引用符で囲まれたエイリアスは、余分な複雑さ(大文字と小文字の区別など)を引き起こす可能性があります。そのため、代わりにアンダースコア文字を使用して、エイリアス内の列名からテーブル名を分離しました。そうすれば、エイリアスを通常の列名と同じように扱うことができます。