尝试从多个表插入时,插入语句返回 ORA-01427 错误
Posted
技术标签:
【中文标题】尝试从多个表插入时,插入语句返回 ORA-01427 错误【英文标题】:Insert Statement Returns ORA-01427 Error While Trying To Insert From Multiple Tables 【发布时间】:2016-03-16 09:40:44 【问题描述】:我有这张 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;
【问题讨论】:
为什么使用子查询而不是连接?为什么会有这么复杂的结构?尝试自行运行子查询以查看问题所在:select b.groupid from BridgeTable b where exists (select p.p1id from pilotkeylookup p where b.pilotid = p.p1id)
将返回多行。子查询与您插入的其他值之间没有关联。
是的,它确实返回了多行。但是我需要根据其他表中匹配的进一步数据将 ID 插入到该表中。什么是正确的解决方案?
将三个表连接在一起,并从每个表中获取相关数据。
【参考方案1】:
您的子查询返回多行,这就是错误消息的内容。您尝试插入单行的各种数据位和子查询之间没有关联。
这可以通过更简单的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
中的所有内容显然都可以从其他表中找到。
【讨论】:
现在我知道应该怎么做了,非常感谢!以上是关于尝试从多个表插入时,插入语句返回 ORA-01427 错误的主要内容,如果未能解决你的问题,请参考以下文章