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

Упражнение 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 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 Больше тэгов
Учебник обновлялся
несколько дней назад
обменять с wex . Из чего на участке построить теплицу?
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.