我正在使用 QMF for 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 列。
有些事情使我感到困惑:我已经检查了我的黄金标准表中的任何空值,但它不包含任何值。因此,它不应该尝试在主表中将任何帐户名设置为null。此外,在最初获得此错误后,我将约束添加到我的查询中gold.acct_name
不为空,因此不应该尝试将主表中的任何值设置为null。
有人可以帮忙解释一下这里发生了什么吗?
答案 0 :(得分:2)
正如Gordon Linoff建议的那样,JBI_SSS_MASTER_T
中THE_GOLDEN_STANDARD
中的行没有匹配的行会收到这些错误:subselect为这些行返回空值。
您需要将更新限制为仅具有匹配项的行:
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)