loading..
Русский    English
01:33
листать

Упражнение 8

Найдите производителя, продающего ПК, но не портативные компьютеры.

Начнем с ошибки новичка:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product
  3. WHERE type = 'PC' AND
  4. NOT (type = 'laptop');

Предикат в предложении WHERE проверяется для каждой строки, формируемой предложением FROM, то есть в нашем случае для каждой строки из таблицы Product. Каждая строка представляет собой некоторую модель, которая может быть чем-то одним, либо ПК, либо портативным компьютером, либо принтером. Поэтому, если выполнен первый предикат (type = 'PC'), то автоматически будет выполнен и второй — NOT (type = 'laptop'). Другими словами, второй предикат здесь излишен. Нам же нужно убедиться в том, что если есть строка с типом PC, то нет другой строки с типом laptop для того же поставщика.

Второе решение, верное по логике, опирается на неверную трактовку предметной области, которую мы уже обсуждали:

Консоль
Выполнить
  1. SELECT DISTINCT p.maker
  2. FROM Product p INNER JOIN
  3. PC ON p.model = PC.model
  4. WHERE p.maker NOT IN (SELECT ip.maker
  5. FROM Laptop il INNER JOIN
  6. Product ip ON il.model = ip.model
  7. );

Здесь проверяется наличие модели ПК в таблице PC и отсутствие модели портативного компьютера для одного и того же поставщика. Ошибка заключается в том, что мы можем получить как лишних поставщиков (если в текущем состоянии базы данных в таблице Laptop отсутствуют модели некоего производителя ПК, хотя они и есть в Product), так и не досчитаться нужных (если в текущем состоянии базы данных нет ни одной модели некоторого поставщика, не производящего портативные компьютеры).

ПиР

Решить задачу на SQL-EX.RU

Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
вчера
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100