Упражнение 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;| [[ column ]] |
|---|
| NULL [[ value ]] |
в подзапросе определяются минимальная цена на цветные принтеры, затем выполняется соединение по этой цене с таблицей принтеров, чтобы найти все принтеры с такой ценой. Наконец, соединение с таблицей Product дает производителей найденных принтеров.
Конечно, соединение по цене можно заменить простым сравнением
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 |
Вторая ошибка заключается в возможном наличии дубликатов, т. к. у одного и того же производителя может иметься несколько принтеров по одной и той же цене.