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)
你的外部查询中有一个笛卡尔积,这是不好的(特别是因为你不想要加入),你需要在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').
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |