使用UPDATE命令时SQL state=23502

使用UPDATE命令时SQL state=23502,sql,sql-update,db2,Sql,Sql Update,Db2,我正在为windows使用QMF。我的代码如下所示: 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 ) 只有在找到匹配的账号时,我才想将主表

我正在为windows使用QMF。我的代码如下所示:

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 )
只有在找到匹配的账号时,我才想将主表中我的
国家账户名称
列的值设置为金本位表中我的
账户名称
值。我的想法是,我不会丢失主表中当前的任何帐户名,除非我在金标准表中为它们提供了一个替换帐户名。问题是当我运行上面的查询时,我得到了
SQL state=23502 SQL code=-407错误
。它表示不允许将NULL值赋值给NOT NULL

有两件事让我困惑:我已经检查了我的黄金标准表中的任何空值,但它不包含任何空值。因此,它不应该试图在主表中将任何帐户名设置为null。另外,在最初获得此错误后,我将约束添加到查询中,即
gold.acct\u name
不为null,因此它不可能尝试将主表中的任何值设置为null


有人能解释一下这里发生了什么吗

正如Gordon Linoff所建议的,对于
JBI\u SSS\u MASTER\T
中的行,如果在
黄金标准中没有匹配的行,则会出现这些错误:对于这些行,子选择返回空值

您需要将更新限制为仅具有匹配项的行:

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)

错误代码与mysql中的不一样。这是用于哪个RDBMS的?请添加一个标记以指定您是否正在使用
mysql
postgresql
sqlserver
oracle
db2
-或其他完全不同的东西。我假设QMF for windows始终使用db2?当我运行您的查询时,我得到一个错误,该操作被取消,因为它在等待服务器响应时超时。