Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:Id不在另一个表中_Sql_Oracle_Oracle11g_Oracle10g - Fatal编程技术网

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);