Упражнение 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
);
[[ 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'
);
[[ column ]] |
---|
[[ value ]] |