Упражнение 18 (подсказки и решения)
Упражнение 18 (подсказки и решения)
В следующем решении:
SELECT c.maker, a.priceA price
FROM (SELECT MIN(price) priceA
FROM Printer
WHERE Color ='y'
) a
INNER JOIN Printer b ON a.priceA = b.price
INNER JOIN Product c ON b.model = c.model;
🚫
[[ error ]]
[[ column ]] |
---|
NULL [[ value ]] |
Конечно, соединение по цене можно заменить простым сравнением
WHERE price = (SELECT min(price) priceA
FROM Printer
WHERE Color ='y'
)
Однако ошибка не в этом, а в том, что отыскиваются любые принтеры, у которых цена совпадает с минимальной ценой на цветные принтеры, что, собственно говоря, и имеет место. В результате получаем:
Maker | Price |
---|---|
D | 270 |
A | 270 |
Правильный же ответ дает только одну строку:
Maker | Price |
---|---|
D | 270 |
Вторая строка не является цветным принтером, в этом легко убедиться, если добавить в предложение SELECT дополнительные столбцы:
SELECT c.maker, a.priceA price, color, b.type
что дает
maker | price | color | type |
---|---|---|---|
D | 270 | y | Jet |
A | 270 | n | Matrix |
Вторая ошибка заключается в возможном наличии дубликатов, т. к. у одного и того же производителя может иметься несколько принтеров по одной и той же цене.