Sql Oracle:Id不在另一个表中
我有以下两张表,机场和飞行Sql Oracle:Id不在另一个表中,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,我有以下两张表,机场和飞行 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); 我想获得机场id,飞行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);
我想获得机场id,飞行id在飞行表中,但不在机场表中。我使用嵌套的select查询死记硬背了以下查询。有没有什么我可以不用写嵌套的东西来提高的地方
select airport_id
from airport
where flying_id not in (select flying_id from flying);
有两种方法
左连接
不存在
左连接
不存在
您对查询性能有实际问题吗?或者你只是认为它一定表现很差,因为你选择了飞行 这样看:数据库需要读取FLYING来获取FLYING_ID集。现在如果FLYING_ID被索引(比如如果它是FLYING的主键),Oracle将不会接触表,因为索引更小。索引是最有效的路径。如果没有索引ID,那么数据库将不得不读取整个表并提取ID集,这显然效率较低,但这是需要完成的最小工作集 <>所以,你应该考虑切换到不存在还是离开外部连接?如果FLYING.FLYING\u ID可以为空,您肯定应该这样做。NOT IN是一个三价测试,如果子查询返回的结果集包含null,则不会返回任何行
请注意,这是一个逻辑问题,而不是性能问题。从性能角度来看,Oracle可能会对NOT EXISTS、NOT IN和LEFT JOIN变量使用相同的执行计划。您对查询性能有实际问题吗?或者你只是认为它一定表现很差,因为你选择了飞行 这样看:数据库需要读取FLYING来获取FLYING_ID集。现在如果FLYING_ID被索引(比如如果它是FLYING的主键),Oracle将不会接触表,因为索引更小。索引是最有效的路径。如果没有索引ID,那么数据库将不得不读取整个表并提取ID集,这显然效率较低,但这是需要完成的最小工作集 <>所以,你应该考虑切换到不存在还是离开外部连接?如果FLYING.FLYING\u ID可以为空,您肯定应该这样做。NOT IN是一个三价测试,如果子查询返回的结果集包含null,则不会返回任何行
请注意,这是一个逻辑问题,而不是性能问题。从性能角度来看,Oracle可能会对NOT EXISTS、NOT IN和LEFT JOIN变体使用相同的执行计划。您是否尝试在AIRPORT和AIR.FLYING\u ID=FLY.FLYING\u ID之间进行左外连接AIR.FLYING\u ID为空时,不认为左外连接会有效。您认为“改进”是什么意思?您的查询不起作用吗?是的,我的查询起作用,但如果您看到嵌套查询,我会首先获取所有记录,我建议您使用not Exists,它将为您改进性能查询。@APC我只是建议夜鹰的情况。您是否尝试在AIR.FLYING\u ID=FLY.FLYING\u ID在AIR.FLYING\u ID为空的情况下在AIR.FLYING\u ID之间进行左外连接,您不认为左外连接将是有效的。“改进”是什么意思?您的查询不起作用吗?是的,我的查询起作用,但如果您看到嵌套查询,我会先获取所有记录,我建议您使用“不存在”,这将为您提高查询性能。@APC我只是建议针对夜鹰的情况。
SELECT DISTINCT F.*
FROM FLYING F
LEFT JOIN AIRPORT A
ON F.FLYING_ID = A.FLYING_ID
WHERE A.AIRPORT_ID IS NULL;
SELECT F.*
FROM FLYING F
WHERE NOT EXISTS
(SELECT 1 FROM AIRPORT A
WHERE A.FLYING_ID = F.FLYING_ID);