UPDATE SCPOMGR.DFUVIEW D
SET D.UDC_NEWDFU = (SELECT (CASE WHEN D1.UDC_CREATIONDATE > ADD_MONTHS (TRUNC(SYSDATE),3)
THEN 1
ELSE 0
END)
FROM SCPOMGR.DFUVIEW D1, SCPOMGR.UDT_GEN_PARAM G
WHERE D.DMDUNIT = D1.DMDUNIT
AND D.DMDGROUP = D1.DMDGROUP
AND D.LOC = D1.LOC
AND G.REGION=VREGION
AND G.JDA_CODE=SUBSTR(D1.DMDUNIT,-2,2)
);
选择0会做什么? 它会选择没有行并用NULL更新列吗?
答案 0 :(得分:0)
在赋值的右侧(要更新的值),您有一个带有CASE表达式的SELECT语句。有一个子查询(带有几个额外过滤器的连接)。 SELECT语句将返回与连接中的行数完全相同的行,并满足所有其他过滤器。对于其中一些行,SELECT语句将返回1,而其他行则返回0。
您是否期望子查询(具有许多WHERE条件的连接)将仅返回一行,然后检查CREATIONDATE并基于此,将值更新为1或0?
原则上,SELECT语句可能会返回多行 - 在这种情况下,您将获得一个不同的错误消息,一些关于标量查询(一个假设是标量,无论如何)返回多行。
子查询也可能根本不返回任何行 - 在这种情况下,SELECT语句根本不会返回任何行,在这种情况下,UPDATE意味着“将NULL分配给左侧的列。分配”。这似乎发生在这里。
没有理由提出异常。但是,如果列(UDC_NEWDFU)具有NOT NULL约束,则会出现异常。
由于CASE表达式只能返回0或1,所以永远不会为NULL,可以进行NULL赋值的唯一方法是子查询(具有许多条件的连接)不返回任何行。在其中一个注释中,您说子查询确实返回行。我不相信你。如果它确实返回了行,那么我不相信你有一个尝试NULL的更新。