【问题标题】:Inserting into too many columns via SELECT query通过 SELECT 查询插入太多列
【发布时间】:2012-07-11 23:15:09
【问题描述】:

虽然这按预期工作:

SQL> 删除表 TEST1; 桌子掉了。 SQL> 创建表 TEST1(COL1 整数,COL2 整数); 表已创建。 SQL> 当 1=1 时插入 2 然后进入测试 1 (COL1, COL2) 3 从双重中选择 1、0; 创建了 1 行。 SQL>

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

SQL> 删除表 TEST1; 桌子掉了。 SQL> 创建表 TEST1(COL1 整数,COL2 整数,COL3 整数); 表已创建。 SQL> 当 1=1 时插入 2 然后进入测试 1(COL1、COL2、COL3) 3 从 DUAL 中选择 1、0、0; 然后进入 TEST1(COL1、COL2、COL3) * 第 2 行的错误: ORA-00918: 列定义不明确 SQL>

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

注意:我使用的是 Oracle 11.2.0.1.0,我尝试在生产环境中执行的实际查询更加复杂,并且引用了其他表(并且使用“VALUES”是不够的)。这只是简化的情况...

【问题讨论】:

    标签: sql database oracle select ora-00918


    【解决方案1】:

    使用别名:

    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】:

    我没有 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;
    

    【讨论】:

      【解决方案3】:

      你用这个会怎样?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        相关资源
        最近更新 更多