3

2つのテーブルがsprocketsありcogsます。

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、23cogsが期待どおりに追加されます。

4 rows inserted

私のスプロケット製造ビジネスが成長するにつれて、どのスプロケットが歯車を必要とするかを決定するためのビジネスロジックははるかに複雑になります。そこで、候補とならないスプロケットを除外する一連の一時テーブルを使用したいと思います。これは、コメントのない1行のステートメントよりも保守しやすいと思います。

--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もエラーは発生しないので、問題は一時テーブルの宣言ではなく、挿入ステートメントにあるはずです。

1行の挿入ステートメントは機能し、複数行の挿入ステートメントは機能しません。私が見る唯一の違いは、後者が一時テーブルから値を取得していることです。

一時テーブルから行を挿入できないのはなぜですか?

4

3 に答える 3

3

これは推測です。今すぐ試すことはできませんが、おそらくこれでうまくいく可能性があります。

insert into cogs
with frobbableSprockets as(
    select * from sprockets where sprockets.id < 40
),
...
select * from sprocketsRequiringCogs
于 2012-08-23T19:23:34.607 に答える
0
 insert into cogs (Id) select Id from sprocketsRequiringCogs 
于 2012-08-23T19:02:50.123 に答える
0

WITH句をインラインビューに置き換えてみてください。つまり、from(select)でselectステートメントを使用します。

于 2012-08-23T19:11:23.223 に答える