Я создал запрос для обновления флага, я использовал оператор CASE, чтобы определить значение. Однако когда я запускаю запрос как оператор UPDATE, обновляется только около половины ожидаемых строк? Еще интереснее то, что ранее я выполнял точно такой же запрос UPDATE для тех же данных, и он работал как ожидалось (то, что заставило меня заняться расследованием старых и новых).
Я попытался выполнить запрос SELECT, используя тот же оператор CASE, я получил правильные результаты, но переключение обратно на UPDATE обновляет только примерно половину записей.
Перемещение критериев в предложение WHERE устранило проблему. Похоже, что оператор CASE в части SET вызывает проблемы. Я не могу понять, почему? Я хотел бы знать, чтобы избежать любой ошибки, которую я сделал в будущем.
Оригинальный код:
UPDATE D
SET PUBLISH_FLAG =
CASE WHEN
MAPPED_CAT NOT IN(1,2,3)
AND SRC != '999'
AND RECEIVED_DATE is not null
AND RECEIVED_DATE <= D.CENSUS_DATE
AND SCHEDULED_FLAG = 'N'
THEN 'Y'
ELSE 'N'
END
FROM TBL_DATA D
INNER JOIN TBL_PUBLISH V
ON D.ID = V.ID
AND D.CENSUS_DATE = V.CENSUS_DATE
AND D.VERSION_NUMBER = V.VERSION_NUMBER
LEFT JOIN TBL_CAT_MAP C
ON D.SRC_CATEGORY = C.SOURCE_CAT
Рабочий код:
UPDATE D
SET PUBLISH_FLAG = 'Y'
FROM TBL_DATA D
INNER JOIN TBL_PUBLISH V
ON D.ID = V.ID
AND D.CENSUS_DATE = V.CENSUS_DATE
AND D.VERSION_NUMBER = V.VERSION_NUMBER
LEFT JOIN TBL_CAT_MAP C
ON D.SRC_CATEGORY = C.SOURCE_CAT
WHERE
MAPPED_CAT NOT IN(1,2,3)
AND SRC != '999'
AND RECEIVED_DATE is not null
AND RECEIVED_DATE <= D.CENSUS_DATE
AND SCHEDULED_FLAG = 'N'
Я думал, что оба должны давать одинаковые результаты? Чего мне не хватает?
Чтобы пояснить, что в приведенном ниже коде 2 показывает разницу, столбец «PUBLISH_FLAG» (обновленный с использованием моего исходного кода или ответа PSK) имеет 10162 значений «Y» (остальные «N»), столбец pub_2 имеет правильные 18917 'Y' значения.
SELECT
PUBLISH_FLAG,
CASE WHEN
MAPPED_CAT NOT IN(1,2,3)
AND SRC != '999'
AND RECEIVED_DATE is not null
AND RECEIVED_DATE <= D.CENSUS_DATE
AND SCHEDULED_FLAG = 'N'
THEN 'Y'
ELSE 'N'
END as pub_2
FROM TBL_DATA D
INNER JOIN TBL_PUBLISH V
ON D.ID = V.ID
AND D.CENSUS_DATE = V.CENSUS_DATE
AND D.VERSION_NUMBER = V.VERSION_NUMBER
LEFT JOIN TBL_CAT_MAP C
ON D.SRC_CATEGORY = C.SOURCE_CAT
WHERE
CASE WHEN
MAPPED_CAT NOT IN(1,2,3)
AND SRC != '999'
AND RECEIVED_DATE is not null
AND RECEIVED_DATE <= D.CENSUS_DATE
AND SCHEDULED_FLAG = 'N'
THEN 'Y'
ELSE 'N'
END = 'Y'