Состояние SQL = 23502 при использовании команды UPDATE

Я использую QMF для Windows. Мой код выглядит так:

UPDATE PIDJBIP.JBI_SSS_MASTER_T SSS
SET SSS.NATIONAL_ACCT_NAME = (
SELECT GOLD.ACCT_NAME
FROM PIDJBIP.THE_GOLDEN_STANDARD GOLD
WHERE SSS.NATIONAL_ACCT_NBR = GOLD.ACCT_NBR AND GOLD.ACCT_NAME IS NOT NULL )

Я хочу установить стоимость моего NATIONAL_ACCT_NAME столбец в основной таблице до значения моего ACCT_NAME Значение в таблице золотого стандарта только тогда, когда я нахожу соответствующие номера счетов. Идея состоит в том, что я не потеряю имена учетных записей, которые в настоящее время находятся в основной таблице, если у меня нет имени замещающей учетной записи для них в таблице золотого стандарта. Проблема в том, что когда я запускаю запрос выше, я получаю SQL state = 23502 SQL code =-407 error, В нем говорится, что присвоение значения NULL столбцу NOT NULL не допускается.

Меня смущает несколько вещей: я проверил свою золотую стандартную таблицу на наличие нулевых значений, и она не содержит никаких. Таким образом, он не должен пытаться установить какие-либо имена учетных записей равными нулю в основной таблице. Кроме того, после получения этой ошибки первоначально я добавил ограничение в свой запрос, который gold.acct_name не является нулевым, поэтому не должно быть никакого возможного способа, которым он пытается установить какие-либо значения в основной таблице на нулевое значение.

Может ли кто-нибудь помочь объяснить, что здесь происходит?

1 ответ

Как предположил Гордон Линофф, вы получаете эти ошибки для строк в JBI_SSS_MASTER_T где не совпадают строки в THE_GOLDEN_STANDARD: подвыбор возвращает нули для тех.

Вы хотите ограничить обновление только теми строками, которые имеют совпадения:

UPDATE PIDJBIP.JBI_SSS_MASTER_T SSS
SET SSS.NATIONAL_ACCT_NAME = (
  SELECT GOLD.ACCT_NAME
  FROM PIDJBIP.THE_GOLDEN_STANDARD GOLD
  WHERE SSS.NATIONAL_ACCT_NBR = GOLD.ACCT_NBR AND GOLD.ACCT_NAME IS NOT NULL )
WHERE EXISTS (SELECT 1
  FROM PIDJBIP.THE_GOLDEN_STANDARD GOLD
  WHERE SSS.NATIONAL_ACCT_NBR = GOLD.ACCT_NBR AND GOLD.ACCT_NAME IS NOT NULL)
Другие вопросы по тегам