質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top