更新表T1 SET COLUMN =从表T1中选择0

时间:2017-08-30 16:39:45

标签: oracle

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更新列吗?

1 个答案:

答案 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的更新。