CREATE TABLE失败ORA 00957重复的列名称

时间:2015-11-17 07:37:12

标签: sql oracle oracle11g ddl

当我尝试在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重复列名

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

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

a.VALIDFLAG, b.VALIDFLAG

您似乎认为表(别名)前缀使投影中的列名称唯一。他们不。表前缀告诉Oracle从哪个表中获取列值(除非您使用的是using连接语法,否则不是这样)。如果列出现在两个表中,则必须在列名前加上表。如果你想要两个表的值,你必须在它们前面加上前缀。

使用简单查询然后引用两个没有列别名的表列是可以的,但尝试使用结果集的东西可能很难。 This is fine

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:重复的列名。

如果您为重复的列添加了别名,请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, ...

答案 1 :(得分:3)

说实话,这个查询很乱。您的SQL语句中有几个错误:

CREATE TABLE AS SELECT 

缺少表名 - 这应该是

CREATE TABLE my_new_table AS SELECT 

创建一个名为my_new_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 

罪魁祸首 - 您选择了两次相同的列。摆脱第二个。

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

要调试此类错误,请尝试

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

2ND UPDATE

使用更新的查询,错误在此处:

   a.VALIDFLAG,
   b,
   VALIDFLAG,

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

答案 2 :(得分:1)

  

ORA-00957:重复的列名

CTAS 语句中出现该错误的唯一原因是您在 SELECT 语句中有类似的列名。虽然您可能会引用不同的表格列,但您没有使用列别名

错误重现:

使用标准EMPDEPT表。

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.

答案 3 :(得分:0)

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

您的查询中存在一些语法错误。纠正了那些。我还检查了重复的列。没有了。现在运行它,让我知道你是否仍然得到相同的错误。

    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)