CREATE TABLE 失败 ORA 00957 列名称重复

CREATE TABLE failed ORA 00957 Duplicate column name

因为我试图从现有的 2 table 创建新的 table,并在 oracle 中使用特定的列名。

我试过下面的代码

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 failed ORA 00957 Duplicate column name

有人可以帮忙吗?

根据来自 OP 的新输入进行编辑。

您的查询中存在一些语法错误。更正了那些。我还检查了重复的列。有none。现在 运行 这个,如果你仍然遇到同样的错误,请告诉我。

    CREATE TABLE D_T1 AS SELECT 
        a.B, a.C,a.C, a.C, a.C,a.J, a.O,
        a.P,a.P,a.S,a.S,a.R,a.B,
        a.S,a.S,b.A,b.C,b.C,b.I, b.M,
        b.P,b.P,b.S,b.S,b.S,b.Z,b.Z,a.C,
        a.CH‌​,a.G,b,V,b.T,a.C,a.C,a.C,
        a.A,a.A‌​Ga.AG
    FROM tbl1 a JOIN tbl2 b 
    ON (a.C= b.C AND a.C1= b.C1) 

ORA-00957: duplicate column name

您的 CTAS 语句中出现该错误的唯一原因是您在 SELECT 语句中有相似的列名.虽然您可能指的是不同的 table 列,但您没有使用 列别名

重现错误:

使用标准 EMPDEPT table.

SQL> CREATE TABLE D_T1 AS
  2  SELECT a.deptno,
  3         b.deptno
  4  FROM emp A
  5  INNER JOIN dept b
  6  ON (a.deptno = b.deptno);
  b.deptno
    *
ERROR at line 3:
ORA-00957: duplicate column name

解决方法:

使用正确的别名:

SQL> CREATE TABLE D_T1 AS
  2  SELECT a.deptno e_deptno,  --add column alias
  3         b.deptno d_deptno   --add column alias
  4  FROM emp a
  5  INNER JOIN dept b
  6  ON (a.deptno = b.deptno);

Table created.

老实说,这个查询一团糟。您的 SQL 语句中有几个错误:

CREATE TABLE AS SELECT 

缺少 table 名称 - 这应该是

CREATE TABLE my_new_table AS SELECT 

创建一个名为 my_new_table 的新 table。

a.ALIDFLAG,b,VALIDFLAG,

我怀疑这真的应该是 a.VALIDFLAG 而不是 a.ALIDFLAG。此外,您需要将 b,VALIDFLAG 替换为 b.VALIDFLAG

SELECT a.BILLFREQ    a.CDHRNUM,

您在 a.BILLFREQ 之后少了一个逗号 - 这是一个语法错误。

a.A‌​GNYCOY,a.AGNTCOY 

罪魁祸首 - 您选择了同一列两次。去掉第二个。

EDIT 实际上,名称不同,所以这不是错误的原因(除非您在评论中输入了错误的查询而不是复制和粘贴)。

要调试此类错误,请尝试

  • 以可读的方式格式化您的 SQL 语句
  • 注释掉除一列以外的所有内容,运行 语句并确保其有效
  • 添加一列
  • 重复直到找到错误或添加了所有列

第二次更新

使用更新的查询,错误在这里:

   a.VALIDFLAG,
   b,
   VALIDFLAG,

您有两列名为 VALIDFLAG - 为其中之一使用别名,它应该可以工作。

忽略您似乎通过重新键入代码引入的其他错误,您已经表明您确实有一个重复的列,这就是错误告诉您的内容:

a.VALIDFLAG, b.VALIDFLAG

您的印象似乎是 table(别名)前缀使投影中的列名唯一。他们不。 table 前缀告诉 Oracle 从哪个 table 获取列值(除非您使用的是 using 连接语法,而您没有使用)。如果列出现在两个 table 中,则必须在列名称前加上 table。如果您想要来自两个 table 的值,则必须为它们添加前缀。

使用简单的查询然后引用两个 table 列而不使用列别名是可以的,但是尝试使用结果集的东西可能会遇到困难。 This is fine:

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

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

但请注意,两列的标题相同。如果您尝试使用该查询创建 table:

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

您会收到您看到的错误,ORA-00957:列名重复。

如果您为重复的列设置别名,则 the problem goes away:

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, ...