通过SELECT查询插入太多列

时间:2012-07-12 08:29:45

标签: sql database oracle select ora-00918

虽然这可以按预期工作:

SQL> DROP TABLE TEST1;

Table dropped.

SQL> CREATE TABLE TEST1 (COL1 INTEGER, COL2 INTEGER);

Table created.

SQL> INSERT WHEN 1=1
  2  THEN INTO TEST1 (COL1, COL2)
  3  SELECT 1, 0 FROM DUAL;

1 row created.

SQL>

我收到一个奇怪的“ORA-00918:列模糊定义”错误,尝试使用两列以上:

SQL> DROP TABLE TEST1;

Table dropped.

SQL> CREATE TABLE TEST1(COL1 INTEGER, COL2 INTEGER, COL3 INTEGER);

Table created.

SQL> INSERT WHEN 1=1
  2  THEN INTO TEST1 (COL1, COL2, COL3)
  3  SELECT 1, 0, 0 FROM DUAL;
THEN INTO TEST1 (COL1, COL2, COL3)
          *
ERROR at line 2:
ORA-00918: column ambiguously defined

SQL>

为什么我在这里收到ORA-00918错误?在INSERT WHEN ... THEN INTO ... SELECT模式中我可以选择多少列是否有限制?

注意:我正在使用Oracle 11.2.0.1.0,而我试图在生产中执行的实际查询更复杂,并且引用其他表(并且使用“VALUES”是不够的)。这只是简化的案例......

3 个答案:

答案 0 :(得分:2)

我没有oracle,但看起来它是内联查询(SELECT FROM DUAL)这就是问题所在。我建议别名该内联查询中的所有字段,然后重试。

INSERT WHEN 1=1
THEN INTO TEST1 (COL1, COL2, COL3)
SELECT 1 AS c1, 0 AS c2, 0 AS c3 FROM DUAL;

答案 1 :(得分:2)

使用别名:

SQL> CREATE TABLE TEST1(COL1 INTEGER, COL2 INTEGER, COL3 INTEGER);

Table created.

SQL> INSERT WHEN 1=1
  2    THEN INTO TEST1 (COL1, COL2, COL3)
  3    SELECT 1 "1", 0 "2", 0 "3" FROM DUAL;

1 row created.

出现这种模糊列错误的原因是因为当您不提供别名时,Oracle将使用一组规则来命名每列。在这种情况下,第二列和第三列具有相同的名称("0"),因此外部查询无法明确引用:

SQL> SELECT 1, 0, 0 FROM DUAL;

         1          0          0
---------- ---------- ----------
         1          0          0

Oracle在执行语义分析时不会查看数据值。

答案 2 :(得分:1)

你使用了什么?使用它?

INSERT WHEN 1=1
THEN INTO TEST1 (COL1, COL2, COL3)
SELECT 1 as col1, 0 as col2, 0 as col3 FROM DUAL;