第二个表中不存在的位置

Mic*_*iel 0 sql oracle oracle11g

当在状态为1的inv中有一个列表时,需要在subinv中找到没有subinv表中列表的子记录的记录.

每个部件号只有一个记录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')       
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 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
       );
Run Code Online (Sandbox Code Playgroud)

这为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;
Run Code Online (Sandbox Code Playgroud)

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