需要在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')
答案 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}})。