繁体   English   中英

Oracle:ID 不在另一个表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM