简体   繁体   English

通过SELECT查询插入太多列

[英]Inserting into too many columns via SELECT query

While this works as expected: 尽管这可以按预期工作:

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>

I receive a strange "ORA-00918: column ambiguously defined" error attempting this with more than two columns: 我收到一个奇怪的“ 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>

Why am I receiving ORA-00918 errors here? 为什么我在这里收到ORA-00918错误? Is there a limit on how many columns I can SELECT in an INSERT WHEN ... THEN INTO ... SELECT pattern? 当...然后进入...选择模式时,我可以在INSERT中选择多少列吗?

Note: I'm using Oracle 11.2.0.1.0, and the actual query I'm attempting to execute in production is more complex and references other tables (and using "VALUES" would not suffice). 注意:我使用的是Oracle 11.2.0.1.0,而我尝试在生产环境中执行的实际查询更加复杂,并且引用了其他表(并且使用“ VALUES”是不够的)。 This is just the simplified case... 这只是简化的情况...

I don't have oracle with me, but it appears that it's the inline query (SELECT FROM DUAL) that's the issue. 我没有oracle,但似乎是问题所在是内联查询(SELECT FROM DUAL) I recommend aliasing all the fields in that inline query and trying again. 我建议给该内联查询中的所有字段加上别名,然后重试。

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

Use aliases : 使用别名:

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.

The reason you get this ambiguous column error is because when you don't provide an alias, Oracle will use a set of rules to name each column. 出现此歧义的列错误的原因是,当您不提供别名时,Oracle将使用一组规则来命名每个列。 In this case the second and third columns have the same name ( "0" ) and thus can not be referenced unambiguously by the outer query: 在这种情况下,第二和第三列具有相同的名称( "0" ),因此不能由外部查询明确引用:

SQL> SELECT 1, 0, 0 FROM DUAL;

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

Oracle doesn't look at the data values when performing semantic analysis. 在执行语义分析时,Oracle不会查看数据值。

What happens you use use this? 使用此东西会发生什么?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM