Упражнение 6
Вот задача, в которой впервые потребовалась информация из нескольких таблиц: имя производителя (maker) находится в таблице Product, а скорость (speed) и объем жесткого диска (hd) в таблице Laptop.
Замечание
Пусть простят нас искушенные в SQL читатели, что мы разбираем ошибки начинающих, но в задачах такой сложности других ошибок и не бывает. Сложность задачи указана в столбце “Уровень” в списке задач. Так что можно перейти к задачам с коэффициентом сложности 2 или 3.
Итак, решение:
SELECT DISTINCT Product.maker, Laptop.speed
FROM Product, Laptop
WHERE Laptop.hd >= 10
AND type IN(SELECT type
FROM Product
WHERE type = 'laptop'
);
[[ column ]] |
---|
[[ value ]] |
При этом автор этого решения пишет, что данный запрос выдает на 5 строк больше, чем в правильном ответе, а запрос, который кажется ему более правильным:
SELECT DISTINCT Product.maker, Laptop.speed
FROM Product, Laptop
WHERE Laptop.hd >= 10;
[[ column ]] |
---|
[[ value ]] |
Ошибка в том, что перечисление таблиц через запятую без указания способа их соединения есть не что иное, как декартово произведение, почитать о котором можно в главе “Использование в запросе нескольких источников записей”.
Мы согласны с тем, что второе решение более правильное. В нем не хватает только условия соединения таблиц. В то время как первое — это попытка подогнать решение, ограничив выдачу второго «правильного» решения только моделями ноутбуков. Следует заметить, что попытка была достаточно неуклюжей, так как, если мы правильно поняли идею автора, вместо предиката
type IN (SELECT type
FROM Product
WHERE type = 'laptop'
)
достаточно было написать
type = 'laptop'