Oracle SQL UPDATE 不适用于 NVL

Posted

技术标签:

【中文标题】Oracle SQL UPDATE 不适用于 NVL【英文标题】:Oracle SQL UPDATE not working with NVL 【发布时间】:2014-09-30 14:13:35 【问题描述】:

我有一个 Oracle sql 表 PS_Z_TREND_NOW_TBL 并试图更新它包含的 11 行的 STATUS 字段。下面的子查询应该将 2 行更新为一个数字。我想将其他 9 行设置为 0。但是当我运行下面的 sql 时,我得到了这个错误: ORA-01407: 无法将 ("SYSADM"."PS_Z_TREND_NOW_TBL"."STATUS") 更新为 NULL

UPDATE PS_Z_TREND_NOW_TBL a
SET STATUS = 
(
SELECT count(SEC.IS_AW_AUTH_NAME)
from PS_IS_AW_SECURITY sec, PS_Z_TREND_NOW_TBL trend
where sec.IS_AW_AUTH_NAME LIKE '%Manager%'
and sec.IS_AW_GRP_ID LIKE '%' || REPLACE(UPPER(trend.DESCR254), ' ', '%') || '%'
and a.DESCR254 LIKE '%' || REPLACE(UPPER(trend.DESCR254), ' ', '%') || '%'
GROUP BY trend.DESCR254
)

我想我需要使用 NVL 函数,但是当我添加它并运行以下查询时,它会将所有 11 行的所有 STATUS 字段更新为 0。有人知道我需要做什么来更改我的查询吗?

UPDATE PS_Z_TREND_NOW_TBL a
SET STATUS = 
NVL((
SELECT count(SEC.IS_AW_AUTH_NAME)
from PS_IS_AW_SECURITY sec, PS_Z_TREND_NOW_TBL trend
where sec.IS_AW_AUTH_NAME LIKE '%Manager%'
and sec.IS_AW_GRP_ID LIKE '%' || REPLACE(UPPER(trend.DESCR254), ' ', '%') || '%'
and a.DESCR254 LIKE '%' || REPLACE(UPPER(trend.DESCR254), ' ', '%') || '%'
GROUP BY trend.DESCR254
), '0')

【问题讨论】:

如果我想将值设置为 0(如果它不在该子查询中),那么查询应该是什么样子? 【参考方案1】:

我认为您需要一个相关子查询,因此请从内部查询中删除 trend。这可能会做你想做的事:

UPDATE PS_Z_TREND_NOW_TBL a
    SET STATUS = (SELECT count(SEC.IS_AW_AUTH_NAME)
                  from PS_IS_AW_SECURITY sec
                  where sec.IS_AW_AUTH_NAME LIKE '%Manager%' and
                        sec.IS_AW_GRP_ID LIKE '%' || REPLACE(UPPER(a.DESCR254), ' ', '%') || '%' 
                )

【讨论】:

以上是关于Oracle SQL UPDATE 不适用于 NVL的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句不适用于 Oracle JDBC

SQL 插入适用于 Oracle SQL Developer,但不适用于 python

Oracle where exists 子句不适用于 SQL Plus

AS 兼容性:“.. from T as a..”适用于 MySQL 和 SQL Server,而不适用于 Oracle? [复制]

.validator('update') 不适用于动态添加的字段

Oracle PL / SQL触发器,在UPDATE之前/之后仅用于识别表中已修改的列