从临时表插入

时间:2012-08-23 18:58:03

标签: sql oracle11g

我有两个表,sprocketscogs

create table sprockets(
    id NUMBER
);

INSERT into sprockets VALUES (4);
INSERT into sprockets VALUES (8);
INSERT into sprockets VALUES (15);
INSERT into sprockets VALUES (16);
INSERT into sprockets VALUES (23);
INSERT into sprockets VALUES (42);

create table cogs(
    id NUMBER
);

我想从sprockets中取一些ID并将它们放入cogs

insert into cogs select id from sprockets s where s.id < 40 and MOD(s.id, 3) != 0;

这会将链轮4,8,16,23按预期添加到cogs

4 rows inserted

随着我的链轮制造业务的发展,确定哪些链轮需要齿轮的业务逻辑将变得更加复杂。所以我想使用一系列临时表来过滤掉非候选链轮。我相信这比没有评论的单行声明更容易维护。

--sprockets with ids greater than 40 are too big to frob, 
--so it's impossible to weld a cog to them
with frobbableSprockets as(
    select id from sprockets where sprockets.id < 40
),

--non-greppable sprockets have built-in harmonic oscillators, 
--so cogs are not required
greppableFrobbableSprockets as(
    select id from frobbableSprockets f where MOD(f.id,3) != 0
),

--not pictured: more filtering using arcane business logic, 
--including but not limited to:
--whether it is raining on a tuesday,
--and if the moon is in the seventh house.

--sprockets with ids less than 3 are from the legacy system and already have cogs
sprocketsRequiringCogs as(
    select id from greppableFrobbableSprockets f where f.id > 3
)

insert into cogs select id from sprocketsRequiringCogs

此代码相对可读,但遗憾的是它不起作用!

insert into cogs select id from sprocketsRequiringCogs 
Error at Command Line:18 Column:2
Error report:
SQL Error: ORA-00928: missing SELECT keyword

如果我将最后一行更改为select id from sprocketsRequiringCogs,则没有错误,因此我知道问题必须在insert语句中,而不是在临时表的声明中。

单行插入语句有效,多行插入语句不起作用。我看到的唯一区别是后者从临时表中获取其值。

为什么我不能从临时表中插入行?

3 个答案:

答案 0 :(得分:3)

这是猜测,我现在无法尝试,但可能会有效:

insert into cogs
with frobbableSprockets as(
    select * from sprockets where sprockets.id < 40
),
...
select * from sprocketsRequiringCogs

答案 1 :(得分:0)

 insert into cogs (Id) select Id from sprocketsRequiringCogs 

答案 2 :(得分:0)

尝试通过内联视图替换WITH子句,即使用from(select)中的select语句。