Упражнение 17 (подсказки и решения)
Итак, избавляемся от декартового произведения. Для этого убираем таблицу PC из предложения FROM, а таблицы Product и Laptop соединяем по столбцу model:
SELECT DISTINCT type, Laptop.model, speed
FROM Laptop, Product
WHERE Product.model = Laptop.model
AND Laptop.speed < (SELECT MIN(speed) FROM PC);
[[ column ]] |
---|
NULL [[ value ]] |
Условие p.type = ’laptop’ уже излишне, так как внутреннее соединение будет содержать модели только данного типа. Оказывается, что можно избавиться и от соединения, поскольку таблица Product используется только для того, чтобы в результирующем наборе вывести тип продукта. Но тип продукта заранее известен — это ноутбук, поэтому мы можем просто применить выражение (константу) для указания типа, убрав соединение:
SELECT DISTINCT 'Laptop' as type, model, speed
FROM Laptop
WHERE speed < (SELECT MIN(speed) FROM PC);
[[ column ]] |
---|
NULL [[ value ]] |
Заметим, что данное решение будет справедливо только в том случае, если в таблице Laptop будут находиться изделия с типом Laptop. Для нашей базы данных это условие выполняется, т. к. имеется всего три типа продукции и соответственно три таблицы. Поэтому нарушение данного условия может быть связано только с изменением структуры, что, впрочем, тоже следует иметь в виду при разработке приложений со встроенными SQL-запросами.