尝试从多个表插入时,插入语句返回 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个选择语句插入临时表

雪花:通过插入值添加多个值时面临问题

如何从两个表创建插入语句脚本

Microsoft SQL Server 2005 从返回多个表的子过程插入表

从返回多个结果集的存储过程中插入临时表

如何使用 SQL 中的 Case 语句将数据插入临时表