Упражнение 23 (подсказки и решения)

Для решения этой задачи используется обычно два подхода: соединение с последующим выбором нужной строки и проверка на попадание производителя в два списка. Следующее неправильное решение, реализует первый подход:

Решение 4.11.1

SELECT DISTINCT a.maker
FROM Product a 
    LEFT JOIN PC b ON a.model = b.model 
              AND b.speed> =750 
    LEFT JOIN Laptop c ON a.model = c.model 
                  AND c.speed> =750
WHERE NOT (b.model IS NULL 
       AND c.model IS NULL
          );
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Это еще один вариант на тему «чего-то одного». Действительно, модель уникальна, т. е. она представляет собой либо ПК, либо ноутбук. В результате внешних соединений получаются строки типа:

maker model(PC) NULL

или

maker NULL model(laptop)

Однако здесь не может быть строк:

maker model(PC) model(laptop)

поскольку соединение выполняется по номеру модели.

В результате в списке имеются производители, которые выпускают только один вид продукции с требуемыми характеристиками. Однако подправить это решение просто, добавив группировку по производителю и посчитав модели. Предлагаем вам сделать это самостоятельно.

Решение 4.11.2

Для демонстрации второго подхода рассмотрим следующий вариант решения:

SELECT DISTINCT t.maker
FROM Product t
WHERE (t.model IN (SELECT model
                    FROM PC
                    WHERE speed >= 750
                    ) 
    OR t.model IN (SELECT model
                    FROM Laptop
                    WHERE speed >= 750
                    )
      ) 
    AND EXISTS (SELECT *
                FROM Product
                WHERE Product.maker = t.maker 
                  AND Product.type='PC'
                ) 
    AND  EXISTS (SELECT *
                FROM Product
                WHERE Product.maker = t.maker 
                    AND Product.type='Laptop'
                );
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
который можно прочитать следующим образом: найти производителя, который выпускает ПК со скоростью не менее 750 МГц или ноутбук со скоростью не менее 750 МГц; при этом данный производитель должен производить ПК и ноутбуки. Несомненный прогресс этого решения по сравнению с решением 1.15.1 состоит в том, что выводятся производители, как ПК, так и ноутбуков. Однако это решение допускает вариант, когда производитель выпускает только ПК со скоростью более 750 МГц, в то время как все его ноутбуки имеют скорость менее 750 МГц, и наоборот.

Вернуться к обсуждению упражнения 23

Решить задачу на SQL-EX.RU