Состояние 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)