ORA-00913 值过多

Posted

技术标签:

【中文标题】ORA-00913 值过多【英文标题】:ORA-00913 too many values 【发布时间】:2017-09-28 14:43:47 【问题描述】:

我有这个问题

INSERT INTO hist_museum (SELECT * from of_owner.museum al
                                JOIN (SELECT vd.city_data_id 
                                        FROM of_owner.city_data vd 
                                        WHERE gps_full_date < add_months(SYSDATE,-12)) vd
                                    ON al.city_data_id = VD.city_data_id);

和表 hist_museum 和博物馆是完全相同的,但即使我得到了这个错误:

Error(10,19): PL/SQL: ORA-00913: demasiados valores

【问题讨论】:

您可能打算使用al.*,但您应该在selectinsert 中都包含列列表。 @GordonLinoff,请转换为答案 【参考方案1】:

执行insert 时的最佳做法是明确列出列:

INSERT INTO hist_museum(col1, col2, . . . )
     SELECT col1, col2, . . .
     FROM of_owner.museum al JOIN
          of_owner.city_data vd 
          ON al.city_data_id = VD.city_data_id
     WHERE gps_full_date < add_months(SYSDATE, -12);

当然,SELECT 中的列,应该用表名来限定。

另外,子查询是不必要的。没有理由只为归档数据编写子查询。

【讨论】:

【参考方案2】:

使用“select * from al JOIN ...”,您可以从 al 和您加入的子请求 vd 中获取所有值。你想要的是

INSERT INTO hist_museum (SELECT al.* from of_owner.museum al
                            JOIN (SELECT vd.city_data_id 
                                    FROM of_owner.city_data vd 
                                    WHERE gps_full_date < add_months(SYSDATE,-12)) vd
                                ON al.city_data_id = VD.city_data_id);

【讨论】:

以上是关于ORA-00913 值过多的主要内容,如果未能解决你的问题,请参考以下文章

Oracle插入数据报错 (ORA-00913: 值过多)

SQL、值过多、结果合并

SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”

ORA-00913: 使用大小写时值太多

ORA-00913: oracle 子查询中的值太多

SQL 错误:ORA-00913:值太多