Oracle - SQL - 插入子选择

时间:2012-12-12 11:40:13

标签: sql oracle

我从以下查询中获得ORA-00947: not enough values

insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb)
F2,
F3,
F4
from tablea;

有人能指出我将inser的子查询包含在/ select语句中的正确方法吗?

由于

2 个答案:

答案 0 :(得分:15)

你只是错过了一个逗号。事实上,Oracle认为F2是您的子选择的名称。

insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb) ,   -- comma here
F2,
F3,
F4
from tablea;

答案 1 :(得分:7)

唯一可靠,快速且可扩展的生成唯一ID的方法是使用序列。

max()“解决方案”不起作用的原因是,事务不会看到来自另一个事务的未提交的更改。因此,两个并发事务最终会使用max()的相同值,这反过来会生成重复的id值。

要根据案例中的序列创建值,您显然需要先创建序列:

create sequence seq_b;

然后在select语句中使用该序列:

insert into tableb
  (colA, colb, colc, cold)
select seq_b.nextval,
       F2,
       F3,
       F4
from tablea;