Notice: Undefined index: lang in /home/virtwww/w_sql-tutorial-ru_a0371b9a/http/modules/sqlbook/sqlbook.php on line 641
Упражнение 6 (компьютеры) | Интерактивный учебник по SQL | SQL-tutorial.ru
loading..
Русский    English
03:21
листать

Упражнение 6

Для каждого производителя, выпускающего ПК-блокноты c объёмом жесткого диска не менее 10 Гбайт, найти скорости таких ПК-блокнотов. Вывод: производитель, скорость.

Вот задача, в которой впервые потребовалась информация из нескольких таблиц: имя производителя (maker) находится в таблице Product, а скорость (speed) и объем жесткого диска (hd) в таблице Laptop.

Примечание:

Пусть простят нас искушенные в  Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL читатели, что мы разбираем ошибки начинающих, но в задачах такой сложности других ошибок и не бывает. Сложность задачи указана в столбце "Уровень" в списке задач. Так что можно перейти к задачам с коэффициентом сложности 2 или 3.

Итак, решение:

Консоль
Выполнить
  1. SELECT DISTINCT Product.maker, Laptop.speed
  2. FROM Product, Laptop
  3. WHERE Laptop.hd >= 10 AND
  4. type IN(SELECT type
  5. FROM Product
  6. WHERE type = 'laptop'
  7. );

При этом автор этого решения пишет, что данный запрос выдает на 5 строк больше, чем в правильном ответе, а запрос, который кажется ему более правильным:

Консоль
Выполнить
  1. SELECT DISTINCT Product.maker, Laptop.speed
  2. FROM Product, Laptop
  3. WHERE Laptop.hd >= 10;
выдает результат со всеми типами продуктов.

Ошибка в том, что перечисление таблиц через запятую без указания способа их соединения есть не что иное, как декартово произведение, почитать о котором можно в главе 5 (пункт 5.6).

Мы согласны с тем, что второе решение более правильное. В нем не хватает только соединения таблиц. В то время как первое — это попытка подогнать решение, ограничив выдачу второго «правильного» решения только моделями блокнотов. Следует заметить, что попытка была достаточно неуклюжей, так как, если мы правильно поняли идею автора, вместо предиката

  1. type IN (SELECT type
  2. FROM Product
  3. WHERE type = 'laptop'
  4. )

достаточно было написать

  1. type = 'laptop'

ПиР

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


Тэги:
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]
Перепечатка материалов сайта возможна только с разрешения автора.