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.AGa.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 列,但您没有使用 列别名
重现错误:
使用标准 EMP
和 DEPT
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.AGNYCOY,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, ...
因为我试图从现有的 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.AGa.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 列,但您没有使用 列别名
重现错误:
使用标准 EMP
和 DEPT
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.AGNYCOY,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, ...