0

3 つの異なるテーブルから挿入しようとしているこのテーブル F_Flight があります。1 列目、4 列目、5 列目は同じテーブルからのもので、2 列目と 3 列目は別のテーブルのものです。コードを実行すると、「単一行のサブクエリが複数の行を返します」というエラーが表示されます。

insert when 1 = 1 then into F_Flight (planeid, groupid, dateid, flightduration, kmsflown) values 
(planeid, (select b.groupid from BridgeTable b where exists (select p.p1id from pilotkeylookup p where b.pilotid = p.p1id)), 
(select dd.id from D_Date dd where exists (select p.launchtime from PilotKeyLookup p where dd."Date" = p.launchtime)),
flightduration, kmsflown) select * from PilotKeyLookup p;
4

1 に答える 1

0

サブクエリは複数の行を返します。これは、エラー メッセージが示す内容です。単一の行に挿入しようとしているさまざまなビットのデータとサブクエリの間に相関関係はありません。

insert...selectこれは、次のような結合を使用して、はるかに簡単に実行できます。

insert into f_flight (planeid, groupid, dateid, flightduration, kmsflown)
select pkl.planeid, bt.groupid, dd.id, pkl.flightduration, pkl.kmsflown
from pilotkeylookup pkl
join bridgetable bt on bt.pilotid = pkl.p1id
join d_date dd on dd."Date" = pkl.launchtime;

これにより、メインの PilotKeyLookup テーブルが、サブクエリで使用したキーの他の 2 つのテーブルに結合されます。

実際の日付の代わりに ID 値を保存するのは珍しいことですlaunchtime。時間の要素があり (名前からそう思われます)、d_dateエントリが日付だけ (つまり、すべて午前 0 時) の場合、一致するものは見つかりません。あなたがする必要があるかもしれません:

join d_date dd on dd."Date" = trunc(pkl.launchtime);

重複データを保存しているため、これはビューである可能性もあるようです-f_flight明らかに、他のテーブルからすべてを見つけることができます。

于 2016-03-16T10:00:25.300 に答える