甲骨文:我不在另一个 table
Oracle: Id Not in another table
我有以下两个 tables,airport 和 flying
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 变体使用相同的执行计划。
我有以下两个 tables,airport 和 flying
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 作为
请注意,这是 逻辑 而非 性能 的问题。从性能的角度来看,Oracle 很可能会对 NOT EXISTS、NOT IN 和 LEFT JOIN 变体使用相同的执行计划。