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

Условие p.type = ’laptop’ уже излишне, так как внутреннее соединение будет содержать модели только данного типа. Оказывается, что можно избавиться и от соединения, поскольку таблица Product используется только для того, чтобы в результирующем наборе вывести тип продукта. Но тип продукта заранее известен — это ноутбук, поэтому мы можем просто применить выражение (константу) для указания типа, убрав соединение:

SELECT DISTINCT 'Laptop' as type, model, speed
FROM Laptop
WHERE speed < (SELECT MIN(speed) FROM PC);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

Заметим, что данное решение будет справедливо только в том случае, если в таблице Laptop будут находиться изделия с типом Laptop. Для нашей базы данных это условие выполняется, т. к. имеется всего три типа продукции и соответственно три таблицы. Поэтому нарушение данного условия может быть связано только с изменением структуры, что, впрочем, тоже следует иметь в виду при разработке приложений со встроенными SQL-запросами.

Перейти к обсуждению упражнения 17

Решить упражнение на SQL-EX.RU