大家好,
当我试图运行下面的查询时,我得到了这个错误。
Update PS_LM_ENRLMT A
Set A.LM_ACT_ID = (Select B.LM_ACT_ID FROM PS_LM_ACT B
where B.LM_ACT_ID = A.LM_ACT_ID
And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'
AND A.LM_ACT_ID = 1166
And A.LM_CI_ID!= 1196)
为了避免Null错误,我更新了查询,如下所示:
Update PS_LM_ENRLMT A
Set A.LM_ACT_ID = (Select B.LM_ACT_ID FROM PS_LM_ACT B
where B.LM_ACT_ID = A.LM_ACT_ID
And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'
AND A.LM_ACT_ID = 1166
And A.LM_CI_ID!= 1196)
where exists
(Select B.LM_ACT_ID FROM PS_LM_ACT B
where B.LM_ACT_ID = A.LM_ACT_ID
And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'
AND A.LM_ACT_ID = 1166
And A.LM_CI_ID!= 1196)
查询成功运行,但没有更新任何数据。我找不到原因。有谁能帮帮忙。
谢谢,AJ
发布于 2015-04-01 09:21:12
听起来好像主表中没有行是子查询返回结果的。因此,第一条语句试图将所有行更新为NULL,这可能违反了表上的约束;第二条语句没有更新任何行,因为EXISTS条件过滤掉了所有行。
基本上,您需要查看数据和查询,并找出原因。但是,在您的查询中有一个明显的潜在问题:
And B.LM_ROW_ADDED_DTTM < '09-DEC-13 05.35.35.000000 PM'
这看起来像是将日期或时间戳列与字符串进行比较,这意味着为了进行比较,将使用会话的NLS_DATE_FORMAT将列值隐式地转换为字符串。如果NLS_DATE_FORMAT与您用于字符串的格式不匹配,结果将非常不可预测。在这种情况下,即使使用的格式是您所期望的,我也怀疑结果是否是您想要的,因为以该格式比较字符串将不会产生与比较等价日期相同的结果。(例如,"08-DEC-14“在词法上小于"09-DEC-13”,但它代表的日期几乎晚于一年。
最好使用日期或时间戳文字,这样就不会发生类型转换:
And B.LM_ROW_ADDED_DTTM < TIMESTAMP '2013-13-09 17:35:35.000'
(如果该列实际上是所需格式的字符串,那么字符串的比较与等效日期值的比较仍然是不同的。)
编辑过的添加了,看起来更近了一点,更新一点意义都没有。子查询需要该B.LM_ACT_ID = A.LM_ACT_ID
,然后如果找到行,则将A.LM_ACT_ID更新为B.LM_ACT_ID中的值-根据定义,这是相同的值。因此,如果这样做确实更新了任何行,则只需将它们设置为与它们已有的值相同。看起来你需要重新评估你正在尝试做的是什么。
https://stackoverflow.com/questions/29375315
复制相似问题