如何解决Oracle:Id不在另一个表中
我有以下两个表格,机场和飞行
create table airport(airport_id number,flying_id,flying_company);
create table flying(flying_id,flying_company);
select airport_id
from airport
where flying_id not in(select flying_id from flying);
我想获取airport_id,其中flying_id存在于飞行表中,但不存在于机场表中。我使用嵌套的选择查询死记号以下查询。不用嵌套,我还能改善吗?
select airport_id
from airport
where flying_id not in (select flying_id from flying);
解决方法
有两种方法。
-
LEFT JOIN
SELECT DISTINCT F.*
FROM FLYING F
LEFT JOIN AIRPORT A
ON F.FLYING_ID = A.FLYING_ID
WHERE A.AIRPORT_ID IS NULL;
-
NOT EXISTS
SELECT F.*
FROM FLYING F
WHERE NOT EXISTS
(SELECT 1 FROM AIRPORT A
WHERE A.FLYING_ID = F.FLYING_ID);
,
查询性能是否存在实际问题?还是您只是认为它一定表现不佳,因为您是从FLYING中选择的?
这样看:数据库需要读取FLYING才能获取FLYING_ID的集合。现在,如果对FLYING_ID进行了索引(例如,如果它是FLYING的主键),则Oracle不会接触该表,因为索引较小。索引是最有效的路径。如果未对FLYING_ID进行索引,则数据库将必须读取整个表并提取ID集,这显然效率较低,但这是需要完成的最少工作集。
因此,您应该考虑将Tejash suggests?切换为NOT EXISTS或LEFT OUTER JOIN。如果FLYING.FLYING_ID可以为null,则绝对应该。 NOT IN是三价测试,如果子查询返回的结果集包含空值,则不返回任何行。 Quick demo on db<>fiddle。
请注意,这是逻辑而不是性能的问题。从性能角度来看,Oracle可能会对NOT EXISTS,NOT IN和LEFT JOIN变体使用相同的执行计划。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。