18

PostgreSQL データベースに大きなクエリがあります。クエリは次のようなものです。

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...

このクエリを SQL クエリとして実行すると、必要な行が返されます。

しかし、同じクエリを使用してビューを作成しようとすると、エラーが返されます。

「エラー: 列 "id" が複数回指定されました。」

(クエリを実行するときに pgAdminIII を使用します。)

結果セットに「id」という名前の列が複数あるため、これが発生すると思います。クエリにすべての列名を書き込まずに、これを解決する方法はありますか?

4

4 に答える 4

20

これは、select *.

ビューに表示する 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
于 2008-10-16T10:02:59.073 に答える
17

結合列のみが重複している (つまり、同じ名前を持っている) 場合は、次のように変更しても問題ありません。

select *
from a, b
where a.id = b.id

に:

select *
from a join b using (id)
于 2009-09-29T17:25:49.803 に答える
-2

言語にはそれを解決する組み込みの方法はありません (率直に言って、* は一般的に悪い習慣です。テーブル スキーマが変更されると、潜在的な欠陥が発生する可能性があるためです。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
于 2008-10-16T13:59:09.003 に答える