loading..
Русский    English
16:36
листать

Упражнение 23 стр. 3

Чтобы не быть голословным, покажем результаты оригинального запроса 1.15.2 с расширением списка выводимых столбцов:

Консоль
Выполнить
  1. SELECT maker, a.model a_m, b.model b_m, c.model c_m
  2. FROM Product a, PC b, Laptop c
  3. WHERE ((b.speed >= 750 AND
  4.         c.speed >= 750
  5.         ) AND
  6.         a.model = b.model
  7.        ) OR
  8.        ((b.speed >= 750 AND
  9.          c.speed >= 750
  10.         ) AND
  11.          a.model = c.model
  12.        );

Рассмотрим пару строк из результирующего набора:

maker a_m b_m c_m
B 1121 1121 1752
A 1752 1121 1752

Как видно, модель 1121 (ПК) принадлежит производителю В, а модель 1752 (портативный компьютер) — производителю А. Так что у нас нет никаких оснований считать, что оба эти производителя удовлетворяют условиям задачи.

Объединение требуемых моделей ПК и портативных компьютеров в один набор дает лишь иллюзию, что мы получаем и то, и другое:

Решение 1.15.3

Консоль
Выполнить
  1. SELECT maker
  2. FROM (SELECT maker
  3.       FROM Product INNER JOIN
  4.            PC ON Product.model = PC.model
  5.       WHERE type='PC' AND
  6.             speed >= 750
  7.       UNION ALL
  8.       SELECT maker
  9.       FROM Product INNER JOIN
  10.             Laptop ON Product.model = Laptop.model
  11.       WHERE type='laptop' AND
  12.             speed >= 750
  13.       ) S
  14. GROUP BY maker;

В результате будет получен список производителей, для которых имеется хотя бы одна строка в наборе из предложения FROM. Ниже более короткий вариант той же ошибки.

Решение 1.15.4

Консоль
Выполнить
  1. SELECT maker
  2. FROM Product
  3. WHERE model IN (SELECT model
  4.                 FROM PC
  5.                 WHERE speed >= 750
  6.                 UNION ALL
  7.                 SELECT model
  8.                 FROM Laptop
  9.                 WHERE speed >= 750
  10.                 )
  11. GROUP BY maker;

Bookmark and Share
Страницы: 1 2 3 4
Тэги:
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 INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.