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

Упражнение 7 (подсказки и решения)

Вот решение, которое использует соединение вместо объединения:

Консоль
Выполнить
  1. SELECT DISTINCT a.model,
  2. ISNULL(b.price, 0)+ISNULL(c.price, 0)+ISNULL(d.price, 0) price
  3. FROM (((Product a LEFT JOIN
  4. PC b ON a.model = b.model
  5. ) LEFT JOIN
  6. Laptop c ON a.model = c.model
  7. ) LEFT JOIN
  8. Printer d ON a.model = d.model
  9. )
  10. WHERE a.maker = 'B';

Здесь применяется три внешних (левых) соединения таблицы Product с каждой из продукционных таблиц.

Отсутствующие значения цены будут заполнены NULL-значениями. Например, для модели 1232 персонального компьютера цена блокнота и принтера будут NULL. Поэтому только один из трех ценовых столбцов будет содержать значение для каждой строки результирующей выборки. Чтобы не определять, какой это столбец, в списке столбцов предложения SELECT используется конструкция

  1. ISNULL(b.price, 0)+ISNULL(c.price, 0)+ISNULL(d.price, 0),
складывающая все три цены, заменяя предварительно NULL-значение нулем. Последнее необходимо, так как сложение с NULL-значением даст NULL. Использование в запросе нестандартной функции ISNULL(price, 0) не принципиально, так как не менее эффективно всю конструкцию можно заменить стандартным COALESCE, даже без суммирования:

  1. COALESCE(b.price, c.price, d.price, 0)

И все же представленное решение имеет один недостаток. Представьте, что у производителя B есть модель, скажем 1133, которой нет в продукционной таблице. Тогда результатом выполнения запроса будет строка:

1133 0
с ценой $0. Такой результат дает неправильную информацию, так как продукции по такой цене нет. Чтобы согласовать данное решение с решением на основе объединения, которое не выводит строки с нулевой ценой, нужно добавить еще и условие отбора по цене. Сделайте это самостоятельно и проверьте правильность своего решения.

Вернуться к обсуждению упражнения 7

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