использование не с вложенными запросами

#sql #sql-server #subquery

#sql #sql-сервер #вложенный запрос

Вопрос:

Меня попросили отобразить результаты в моей базе данных sql server для следующего вопроса

Какие программные пакеты не установлены ни на одном компьютере HP? Я пробовал следующее, но я все еще получаю результаты для PACKNAME Manta, но этот пакет установлен на компьютере HP. Чего я не понимаю?

 select * from package where PACK in
  ( select PACK from software where TAGNUM in 
   ( select tagnum from PC where comp NOT in
     ( select comp from computer where MFRNAME = 'HP')))
  

Я прикрепил изображение данных для вашей справки ниже

введите описание изображения здесь

Комментарии:

1. это выглядит как какой-то homework . Прежде чем мы попытаемся помочь вам с запросом, существует ли какой-либо конкретный метод запроса, который вы должны использовать или не можете использовать?

2. Мне сказали использовать только вложенные запросы.

3. На любой запрос, который отвечает на вопрос «где что-то не существует», обычно лучше всего отвечать шаблоном NOT EXISTS (вложенный запрос). Делает его действительно простым для понимания и в целом эффективным для запуска. Я бы исследовал это.

4. mysql или sql-server? Это не одно и то же.

5. Это для Microsoft SQL server management studio 17

Ответ №1:

Вы можете использовать NOT EXISTS с коррелированным вложенным запросом, который объединяет другие таблицы вместе и содержит ваше условие фильтрации:

 select
pk.pack,
pk.packname,
pk.packv,
pk.packtype,
pk.packcost
from package pk
where not exists (
                    select 1
                    from software s
                    inner join pc on pc.tagnum = s.tagnum
                    inner join computer c on c.comp = pc.comp
                    where s.pack = pk.pack
                    and c.mfrname = 'HP'
                 )
order by pk.pack;
  

Результат

 | pack |         packname | packv |        packtype | packcost |
|------|------------------|-------|-----------------|----------|
| AC11 | Quick Accounting |   4.1 |      Accounting |   754.95 |
| AC12 |   Accounting MIS |   4.0 |      Accounting |     2000 |
| AC13 |        Quickbook |  2005 |      Accounting |      300 |
| DB11 |            Manta |   1.5 |        Database |      380 |
| DB13 |       SQL Server |  2005 |        Database |      500 |
| DB14 |           My SQL |  2005 |        Database |      300 |
| SS11 |          Easycal |   5.5 |     Spreadsheet |   225.15 |
| WP04 |       Word Power |     2 | Word Processing |      118 |
| WP07 |        Good Word |   3.2 | Word Processing |       35 |
| WP14 |           GOOGLE |     2 | Word Processing |      118 |
  

Пример SQL Fiddle

Ответ №2:

 ;with installed as
( select PACK from software where TAGNUM in ( select tagnum from PC where comp in ( select comp from computer where MFRNAME = 'HP')))
select * from Package p left join installed i on p.pack = i.pack
where i.pack is null
  

Комментарии:

1. Спасибо за быстрый ответ, но я все еще получаю результат с именем ПАКЕТА MANTA в списке.

2. Тогда он должен быть в списке. вы проверили?

3. ДА. Manta установлена на компьютере HP, связанном с ПАКЕТОМ DB22, но вопрос сформулирован таким образом, что он ищет все пакеты, которые не установлены ни на одном компьютере HP