[英]Oracle: Id Not in another table
我有以下两张表,机场和飞行
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,其中 fly_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 的建议切换到 NOT EXISTS 或 LEFT OUTER JOIN吗? . 如果 FLYING.FLYING_ID 可以为空,你当然应该这样做。 NOT IN 是三价测试,如果子查询返回包含 null 的结果集,则不会返回任何行。 db<>fiddle 上的快速演示。
请注意,这是逻辑问题而不是性能问题。 从性能角度来看,Oracle 可能会对 NOT EXISTS、NOT IN 和 LEFT JOIN 变体使用相同的执行计划。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.