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

Конечно, соединение по цене можно заменить простым сравнением

WHERE price = (SELECT min(price) priceA
               FROM Printer
               WHERE Color ='y'
               )

Однако ошибка не в этом, а в том, что отыскиваются любые принтеры, у которых цена совпадает с минимальной ценой на цветные принтеры, что, собственно говоря, и имеет место. В результате получаем:

MakerPrice
D270
A270

Правильный же ответ дает только одну строку:

MakerPrice
D270

Вторая строка не является цветным принтером, в этом легко убедиться, если добавить в предложение SELECT дополнительные столбцы:

SELECT c.maker, a.priceA price, color, b.type

что дает

makerpricecolortype
D270yJet
A270nMatrix

Вторая ошибка заключается в возможном наличии дубликатов, т. к. у одного и того же производителя может иметься несколько принтеров по одной и той же цене.

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

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