查询从Oracle 10g到11g

时间:2017-12-07 20:39:32

标签: sql database oracle oracle11g oracle10g

我正在使用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;

1 个答案:

答案 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列表中。