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

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

В решении 2.3.1 используется полное внешнее соединение (FULL JOIN) подзапросов, чтобы учесть возможные варианты, когда в результате выполнения этих подзапросов для какого-нибудь пункта приема либо сумма прихода, либо сумма расхода будет NULL-значением (другими словами, не было расхода и/или прихода). Если, скажем, полученный приход составляет 1000, а расход — 800, то будут учтены все возможные варианты:

Приход    Расход
1000    800
NULL    800
1000    NULL

Варианта NULL NULL быть не может, так как это бы означало, что пункта приема просто не существовало (на данный момент времени).

В предложении SELECT используется конструкция, которая должна заменить NULL нулем в выражении вычисления остатка. Логика совершенно правильная, однако конструкция применена неверно:

  1. CASE inc
  2.      WHEN NULL
  3.      THEN 0
  4.      ELSE inc
  5. END

Ошибка заключается в том, что здесь фактически задействована простая операция сравнения с NULL-значением, а именно,

  1. CASE
  2.      WHEN inc = NULL
  3.      THEN 0
  4.      ELSE inc
  5. END

Сравнение же с NULL-значением всегда дает UNKNOWN. Поэтому условие WHEN не выполняется, в результате чего выполняется ветвь ELSE, всегда возвращая значение inc, даже в том случае, когда inc есть NULL.

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

Решить упражнение на SQL-EX.RU


Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100