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

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

Вот попытка «изменить» ситуацию в лучшую сторону:

Решение 1.15.2

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

Используя равенство предикатов

  1. x AND (y OR z) = (x AND y) OR (x AND z),
выполним синтаксические преобразования рассматриваемого запроса:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  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. );

В результирующий набор попадут строки, удовлетворяющие хотя бы одному из предикатов, соединяемых оператором OR. Рассмотрим, например, запрос с первым предикатом:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  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. );

Перепишем его в синтаксически более удобной форме:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product a JOIN
  3. PC b ON a.model = b.model,
  4. Laptop c
  5. WHERE (b.speed >= 750 AND
  6. c.speed >= 750
  7. );
и далее

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM (SELECT maker
  3. FROM Product a JOIN
  4. PC b ON a.model = b.model
  5. WHERE b.speed >= 750
  6. ) x,
  7. (SELECT *
  8. FROM Laptop c
  9. WHERE c.speed >= 750
  10. ) y;

Теперь, пожалуй, уже можно проанализировать. Первый подзапрос, который мы обозначили х соединяет по внешнему ключу таблицу PC с таблицей Product, отбирая производителей ПК со скоростью больше или равной 750. Второй подзапрос (y) фильтрует модели портативных компьютеров со скоростью больше или равной 750.

То, как соединяются x и y, называется декартовым произведением. То есть производитель требуемых ПК будет в результирующем наборе сочетаться с каждой моделью ПК-блокнота, даже если она произведена другим производителем.

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

Совпадение результатов на основной базе является совершенно случайным. Так уж оказалось, что те производители, которые выпускают требуемые по условию задачи ПК, выпускаю также и нужные портативные компьютеры. Таким образом, несмотря на совпадение результатов на «видимой» базе, запрос не является правильным при любом совместимом со схемой состоянием базы данных.

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 Больше тэгов
Учебник обновлялся
несколько дней назад
https://exchangesumo.com/obmen/QIWIRUB-BTC
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100