質問
PostgreSQLデータベースに大きなクエリがあります。 クエリは次のようなものです:
SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...
このクエリをSQLクエリとして実行すると、目的の行が返されます。
しかし、同じクエリを使用してビューを作成しようとすると、エラーが返されます:
"エラー:列" id"複数回指定しました。"
(クエリの実行時にpgAdminIIIを使用します。)
結果セットには" id"という名前の列が複数あるため、これが起こると思います。クエリにすべての列名を書き込まずに、これを解決する方法はありますか?
解決
これは、select *が原因で、ビューにはtable1から1つ、table2から1つという名前の列という2つのIDがあるためです。
ビューに含めるIDを指定する必要があります。
SELECT table1.id, column2, column3, ... FROM table1, table2
WHERE table1.id = table2.id
同じ名前の列を持つことができるため、クエリは機能します...
postgres=# select 1 as a, 2 as a;
a | a
---+---
1 | 2
(1 row)
postgres=# create view foobar as select 1 as a, 2 as a;
ERROR: column "a" duplicated
postgres=# create view foobar as select 1 as a, 2 as b;
CREATE VIEW
他のヒント
結合列のみが重複している場合(つまり、同じ名前を持っている場合)、次のように変更してください:
select *
from a, b
where a.id = b.id
to:
select *
from a join b using (id)
to_date
のような関数を使用して、「定義済み」を2回以上取得しようとしているためにここに来た場合エラー、関数には列エイリアスを使用する必要があることに注意してください。例:
to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date
それを解決するための言語には組み込みの方法はありません(そして、率直に言って、*はテーブルスキーマが変更されると潜在的な欠陥を引き起こす可能性があるため、一般的に悪い習慣です-table1。*、table2.acolumn、 tabl2.bcolumnあるテーブルすべてを選択し、別のテーブルから選択したい場合)、PostgreSQLがINFORMATION_SCHEMAをサポートする場合、次のようなことができます:
DECLARE @sql AS varchar
SELECT @sql = COALESCE(@sql + ', ', '')
+ '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']'
+ CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION
PRINT @sql
結果を貼り付けて、入力の手間を省きます。もちろん、同じ名前の列に手動で別名を付ける必要があります。必要に応じて、一意の名前をコード生成することもできます(ただし、私はしません):
SELECT @sql = COALESCE(@sql + ', ', '')
+ '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] '
+ 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']'
+ CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION