где не существует во второй таблице - PullRequest
0 голосов
/ 07 января 2012

Нужно найти записи в subinv, которые НЕ имеют списка в таблице subinv с подстатусом 1 когда в инве есть листинг со статусом 1.

В 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 Ответ

5 голосов
/ 07 января 2012

У вас есть декартово произведение в вашем внешнем запросе, что не очень хорошо (особенно если вы не хотите, чтобы это соединение все равно было), и вам нужно указать номер детали в запросе 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').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...