甲骨文:我不在另一个 table

Oracle: Id Not in another table

我有以下两个 tables,airportflying

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 在飞行 table 中出现,但在机场 table 中不出现。我使用嵌套 select 查询来记录以下查询。无论如何我可以改进而不写嵌套?

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 将不会触及 table 因为索引较小。索引是最有效的路径。如果 FLYING_ID 没有索引,那么数据库将不得不读取整个 table 并提取 ID 集,这显然效率较低,但这是需要完成的最少工作集。

那么,您是否应该考虑切换到 NOT EXISTS 或 LEFT OUTER JOIN 作为 . Definitely you should if FLYING.FLYING_ID can be null. NOT IN is a trivalent test, and will return no rows if the subquery returns a result set which contains null. Quick demo on db<>fiddle

请注意,这是 逻辑 而非 性能 的问题。从性能的角度来看,Oracle 很可能会对 NOT EXISTS、NOT IN 和 LEFT JOIN 变体使用相同的执行计划。