Язык запросов SQL


Подзапросы перед которыми стоит ключевое слово NOT IN



Подзапросы, перед которыми стоит ключевое слово NOT IN

Запрос с ключевым словом IN, приведенный в предыдущем разделе, помог руководству фирмы узнать, какие товары нельзя будет продавать. Хотя это и ценная информация, но на ней много не заработаешь. А вот что действительно надо знать руководству Zetec — какие товары молено будет активно продавать. Руководство фирмы хочет продвигать именно те товары, в состав которых мониторы не входят. Такую информацию можно получить с помощью подзапроса, перед которым стоит ключевое слово NOT IN:

SELECT Model

    FROM COMP_USED

    WHERE Model NOT IN

        (SELECT Model

            FROM COMP_USED

            WHERE CompID IN

                 (SELECT CompID

                    FROM COMPONENT

                    WHERE CompType = 'Monitor')) ;

В результате выполнения этого оператора получаем следующее:

Model

--------

РХ3040

РВ3050

РХ3040

РВ3050

Здесь надо сказать о двух моментах.

  • В этом запросе имеются два уровня вложенности. Два подзапроса — это в точности оператор предыдущего запроса. Теперь он вложен во внешний замыкающий оператор SELECT. Он принимает список товаров, в состав которых входят мониторы. Перед SELECT стоит другое ключевое слово — NOT EM. В результате действия внешнего оператора создается еще один список. В нем перечислены модели всех продуктов, за исключением тех, в состав которых входят мониторы.
  • В получившейся виртуальной таблице некоторые строки могут повторяться. Причина повторений следующая. Название товара, собранного из нескольких компонентов, среди которых нет мониторов, встречается в нескольких строках таблицы COMPJUSED. И каждой такой строке соответствует отдельная строка в получившейся виртуальной таблице.

В этом примере количество строк не является проблемой, потому что получившаяся виртуальная таблица является короткой. Однако в реальной жизни такая таблица может состоять из сотен и тысяч строк. Чтобы не было путаницы, повторяющиеся строки необходимо убирать. Это сделать достаточно легко, если в запрос вставить ключевое слово DISTINCT (различный). Тогда в виртуальную таблицу будут добавляться только те строки, которые отличаются от уже имеющихся:

SELECT DISTINCT Model

 FROM COMP_USED

  WHERE Model NOT IN

      (SELECT Model

           FROM COMP_USED

           WHERE CompID IN

                (SELECT CompID

                    FROM COMPONENT

                    WHERE CompType = 'Monitor')) ;

Как и ожидалось, результат получился следующий:

Model

--------

РХ3040

РВ3050









Начало  Назад  Вперед