我正在使用Oracle 11g
开发自动化。我有以下查询在oracle 10g
但不是11。
update(
select rirr.NUM_SERIE_ULT,
tri.T_USED_IMEI,
rirr.celular,
tri.MSISDN,
rirr.TRAFICO,
case when rirr.celular = tri.MSISDN then 'MISMO ABONADO'
when rirr.celular <> tri.MSISDN then 'OTRO ABONADO'
else 'SIN TRAFICO'
end as TRAFICO_ACTUALIZAR
from RENOVACIONES_INT_RENO_REPO rirr
left join TRAFICO_RENOVACION_INTERNA tri
on rirr.NUM_SERIE_ULT = tri.T_USED_IMEI
)
set TRAFICO = TRAFICO_ACTUALIZAR;
答案 0 :(得分:1)
错误:
您正在更新表TRAFICO
中的列rirr
(不是实际的表名,而是您在查询中使用的别名)。此表已连接到联接条件tri
上的表rirr.NUM_SERIE_ULT = tri.T_USED_IMEI
。
对于rirr
中的每一行,Oracle必须在tri
中找到满足连接条件的唯一行。这意味着:表NUM_SERIE_ULT
中的列rirr
可能有重复项;但是表T_USED_IMEI
中的列tri
必须是唯一的(不能有重复项)。另外,在Oracle使用连接实现UPDATE语句时,需要(在Oracle 10中,我相信)表tri
在列T_USED_IMEI
上具有UNIQUE索引或UNIQUE约束。如果UPDATE语句在Oracle 10中有效,则很可能您有这样的索引或约束。
Oracle 11中是否仍存在此类索引或约束?如果您所做的只是升级,则不应删除/删除索引或约束;但这就是错误信息的意思......
无关的观察:
在UPDATE的SELECT子查询中选择其他列有什么意义?即:rirr.NUM_SERIE_ULT, tri.T_USED_IMEI, rirr.celular, tri.MSISDN
。前两个出现在连接条件中;另外两个出现在TRAFICO_ACTUALIZAR
的定义中。但这并不意味着您需要这四列中的任何也单独显示在SELECT
列表中。