1. ホーム
  2. sql

[解決済み] CREATE TABLE に失敗しました ORA 00957 カラム名が重複しています。

2022-02-15 03:22:07

質問

Oracleで既存の2つのテーブルから特定のカラム名で新しいテーブルを作成しようとしました。

以下のコードを試してみました。

CREATE TABLE D_T1
AS
   SELECT a.col1, a.col2, a.col3, a.col4, a.col5, b.col6, b.col7, b.col8
   FROM db1.table1 a INNER JOIN db1.table2 b
   ON (a.col1 = b.colNum AND a.col2 = b.colnum1)

しかし、エラーが発生します。

<ブロッククオート

CREATE TABLE に失敗しました ORA 00957 カラム名が重複しています。

どなたか助けてください。

どのように解決するのですか?

コードを再入力することで発生した他のエラーは無視し、カラムが重複していることを示しましたが、これはエラーが教えてくれていることです。

a.VALIDFLAG, b.VALIDFLAG

テーブル (エイリアス) プレフィックスによって、プロジェクションのカラム名が一意になると思い込んでいるようですが、それは間違いです。しかし、そうではありません。テーブルプレフィックスは、Oracle にどのテーブルからカラムの値を取得するかを伝えます (ただし、テーブルプレフィックスに using の結合構文を使用します(使用しません)。カラムが2つのテーブルに存在する場合、カラム名の前にテーブルを付けなければなりません。もし両方のテーブルから値を取得したい場合は、両方のテーブルのプレフィックスを付けなければなりません。

単純なクエリであれば、カラム・エイリアスなしで両方のテーブルのカラムを参照しても問題ありませんが、結果セットを消費しようとするものでは苦労するかもしれません。 これは大丈夫です :

select a.dummy, b.dummy
from dual a
join dual b on b.dummy = a.dummy;

 DUMMY   DUMMY 
------- -------
     X       X 

しかし、両方の列が同じ見出しを持っていることに注意してください。もしそのクエリを使ってテーブルを作ろうとすると

create table x as
select a.dummy, b.dummy
from dual a
join dual b on b.dummy = a.dummy;

ORA-00957: カラム名が重複している」というご覧のようなエラーが発生します。

重複したカラムのエイリアスを作成すると この問題は解決されます。 :

create table x as
select a.dummy as dummy_a, b.dummy as dummy_b
from dual a
join dual b on b.dummy = a.dummy;

ですから、あなたの場合、両方のカラムが必要であれば、これらのカラムをエイリアス化することができます。

..., a.VALIDFLAG AS validflag_a, b.VALIDFLAG AS validflag_b, ...