web-dev-qa-db-ja.com

同じ名前の列を持つテーブル間の結合としてのCREATE VIEW

タイトルが言うように、同じ名前の列(驚くべきことに "id")を持つテーブル間の結合からビューを作成したいと思います。

Postgresは結果にテーブル名を付加しませんが、何らかの理由でクエリが正常に機能し、同じ名前と異なるデータを持つ複数の列を返します。

CREATE TABLEは許容範囲が狭く、次を返します:

ERROR: column "id" specified more than once

他の人は別の名前で列をSELECTingすることを提案しています(例 here )が、両方のテーブルに多くの列があります。

id列( this way など)を何らかの方法で自動的に名前変更/削除する必要がありますか、それとももっと良い方法がありますか?

3
Ohad

あなたが参照した質問への私の回答にバグがありました。その間、私は他のいくつかの詳細を改善しました:

多くの列がある場合や繰り返し使用する場合は、その上で概説しているように動的SQLを使用します。

適切な命名規則を使用している場合、これらのケースのほとんどを回避できます。 idを列名として使用しないでください。難しい方法を見つけているだけなので、あいまいすぎます。私は使うだろう tbl_id代わりに、「tbl」はテーブル名です。
残念ながら、一部のORMはこのアンチパターンを使用しています。

また、PostgresはプレーンなSELECT内の個別の列名を必要としないため、プレーンなSELECTの例外は発生しません(ただし、この機能の有用性はアドホッククエリに限定されます)。ただし、サブクエリの派生テーブルであっても、テーブルまたはビューの列には異なる名前が必要です。 マニュアル:

テーブルと同じように、SELECTのすべての出力列には名前があります。 単純なSELECTでは、この名前は表示用に列にラベルを付けるために使用されますが、SELECTがより大きなクエリのサブクエリでは、名前はより大きなクエリによって、サブクエリによって生成された仮想テーブルの列名として認識されます。

Postgresは個別のラベルを必要としません。ただし、あいまいさを避けるために、実際の列名は区別する必要があります。

3