第二个表中不存在的位置

时间:2012-01-07 05:33:05

标签: sql oracle oracle11g

需要在subinv中找到没有subinv表中带有substatus 1的列表的记录 如果在状态为1的inv中有列表。

inv中每个部件编号只有一条记录,但subinv中的多条记录可能是多个状态编号之一。我的语句没有返回任何行,显示没有错误,但有记录符合条件。

SELECT m.partnum        
  FROM inv m, 
       subinv s     
 WHERE m.status = '1'
   AND not exists (SELECT s.partnum     
                     FROM subinv s1
                    WHERE s1.substatus = '1')       

1 个答案:

答案 0 :(得分:5)

你的外部查询中有一个笛卡尔积,这是不好的(特别是因为你不想要加入),你需要在EXISTS查询中指定部件号:

SELECT m.partnum
  FROM inv AS m
 WHERE m.status = '1'
   AND NOT EXISTS
       (SELECT *
          FROM SubInv AS s1
         WHERE s1.substatus = '1'
           AND s1.partnum = m.partnum
       );

这为NOT EXISTS提供了相关的子查询。值得检查已过滤的OUTER JOIN的性能:

SELECT i.partnum
  FROM inv AS i
  LEFT JOIN subinv AS s ON s.partnum = i.partnum AND s.substatus = '1'
 WHERE i.status = '1'
   AND s.substatus IS NULL;

当没有s.substatus的行时,LEFT JOIN条件将为s.substatus = '1'生成NULL,并且WHERE子句仅选择此类行。作为转换并不是很明显,但它可能比子查询更快,因为它是一个连接而不是必须为主inv表中的每一行执行的子查询(满足{ {1}})。