На главную страницу
Характерные ошибки при решении упражнений.
Задача 8
Моисеенко С.И.
Найдите производителя, продающего ПК, но не ПК-блокноты.
Вот одно из неправильных решений, которое ранее проходило:
SELECT DISTINCT p.maker
FROM Product p INNER JOIN pc
ON p.model = pc.model
WHERE p.maker NOT IN
(SELECT ip.maker FROM Laptop il INNER JOIN
Product ip ON il.model = ip.model)
Здесь, вероятно, сказывается недостаток в описании предметной области, которое
сознательно писалось кратким, чтобы оно постоянно было перед глазами на
странице с упражнениями и не занимало при этом много места.
Представленное решение находит производителя, модели которого есть в таблице PC,
и нет - в таблице Laptop. На самом деле для решения этой задачи достаточно
одной лишь таблицы Product, в которой имеется поле type, описывающее тип
продукции (PC, Laptop, Printer).
Таблица Product связана отношением один-ко-многим с другими таблицами по типам
продукции.
Последнее означает, что в таблице Product могут быть модели, отсутствующие в
таблице соответствующего типа продукции. Таким образом, если некий
производитель имеет модели ПК-блокнотов, но их нет (в текущий момент) в таблице
Laptop, то представленный запрос будет выводить этого производителя (если в
таблице PC есть его модели). Хотя, на мой взгляд, не должен.
В настоящее время данные в проверочную базу добавлены и этот запрос уже не
проходит.
В заключение дам следующую трактовку данной предметной области. Таблица Product
содержит информацию о поставщиках моделей, а остальные таблицы - модели,
которые имеются в наличии, например, на складе некой фирмы.
Перейти к
решению задачи #8
На главную страницу