У вас есть декартово произведение в вашем внешнем запросе, что не очень хорошо (особенно если вы не хотите, чтобы это соединение все равно было), и вам нужно указать номер детали в запросе 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;
Условие LEFT JOIN сгенерирует NULL для s.substatus
, когда нет строки с s.substatus = '1'
, а предложение WHERE выбирает только предложениетакие строки.Не слишком очевидно как преобразование, но он может быть быстрее, чем подзапрос, просто потому, что это соединение, а не подзапрос, который должен выполняться для каждой строки в основной таблице inv
(которая удовлетворяет status = '1'
).