Oracle - SQL - 插入子选择

Dr.*_*che 9 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Thi*_*ilo 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;
Run Code Online (Sandbox Code Playgroud)

  • 如果要生成唯一的记录号,请考虑使用序列. (2认同)

a_h*_*ame 7

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

max()"解决方案"无法工作的原因是,事务不会从另一个事务中看到未提交的更改.因此,两个并发事务可以使用相同的值结束,max()这反过来将生成重复的id值.

要在您的案例中创建序列中的值,您显然需要首先创建一个序列:

create sequence seq_b;
Run Code Online (Sandbox Code Playgroud)

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

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