loading..
Русский    English
20:42
листать

Упражнение 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

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100