使用UPDATE命令时SQL状态= 23502

时间:2015-08-07 12:47:04

标签: sql sql-update db2

我正在使用 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。

有人可以帮忙解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

正如Gordon Linoff建议的那样,JBI_SSS_MASTER_TTHE_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)