0

我有这张 F_Flight 表,我试图从 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 表连接到您在子查询中使用的键上的其他两个表。

存储 ID 值而不是实际日期是不寻常的,如果launchtime有一个时间部分——从名称上看很可能——并且您的d_date条目只是日期(即所有时间都在午夜),那么您将找不到匹配项;你可能需要做:

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

看起来这也可能是一个视图,因为您正在存储重复数据 -f_flight显然,可以从其他表中找到其中的所有内容。

于 2016-03-16T10:00:25.300 回答