具有内部联接的Oracle Update语句

时间:2014-08-06 15:03:41

标签: sql oracle sql-update

我有一个需要内部联接的更新查询。

但我不知道如何在Oracle Query中使用联接

任何帮助都会非常感激。

UPDATE ORDTRAN_NOM_AGG_DETAIL D
            JOIN FCS.ORDTRAN_NOM_AGG_HEADER H
                  ON H.AGG_HEADER_SEQ = D.AGG_HEADER_SEQ
        SET
             CASH_VALUE = DECODE (D.MONEY_UNITS, 'U', D.UNIT_VALUE * H.PRICE, 'M', D.CASH_VALUE),
             UNIT_VALUE = DECODE (D.MONEY_UNITS, 'U', D.UNIT_VALUE, 'M', D.CASH_VALUE * H.PRICE , D.UNIT_VALUE)
        WHERE H.AGG_HEADER_SEQ = 5379 AND D.ALLOW_PRICING = 'Y';

2 个答案:

答案 0 :(得分:1)

尝试这样的事情。

UPDATE (SELECT D.MONEY_UNITS AS MU,
               D.UNIT_VALUE AS UV,
               H.PRICE AS PR,
               D.CASH_VALUE AS CH,
               H.AGG_HEADER_SEQ AS AHS,
               D.ALLOW_PRICING AS AP
          FROM ORDTRAN_NOM_AGG_DETAIL D
               JOIN FCS.ORDTRAN_NOM_AGG_HEADER H
                  ON H.AGG_HEADER_SEQ = D.AGG_HEADER_SEQ) JN
   SET JN.CH = DECODE (JN.MU,  'U', JN.UV * JN.PR,  'M', JN.CH),
       JN.UV = DECODE (JN.MU,  'U', JN.UV,  'M', JN.CH * JN.PR,  JN.UV)
 WHERE JN.AHS = 5379 AND JN.AP = 'Y';

我希望这会有所帮助。

答案 1 :(得分:0)

提供的解决方案@ Tony891206实际上是理想的方式,但它预先假定有支持它的主键。好消息是,如果没有,Oracle会抱怨修改指定键不支持的表的列,但不会进行不正确的更新。

如果由于缺少主键而他的语法不起作用而您无法添加它们,则此语法将起作用:

UPDATE ORDTRAN_NOM_AGG_DETAIL D
set (cash_value, unit_value) = (
  select
    DECODE (D.MONEY_UNITS, 'U', D.UNIT_VALUE * H.PRICE, 'M', D.CASH_VALUE),
    DECODE (D.MONEY_UNITS, 'U', D.UNIT_VALUE, 'M',
        D.CASH_VALUE * H.PRICE , D.UNIT_VALUE)
  from FCS.ORDTRAN_NOM_AGG_HEADER H
  where
    H.AGG_HEADER_SEQ = D.AGG_HEADER_SEQ and
    H.AGG_HEADER_SEQ = 5379
)
where
  D.ALLOW_PRICING = 'Y' and
  exists (
    select null
    from FCS.ORDTRAN_NOM_AGG_HEADER H
    where
      H.AGG_HEADER_SEQ = D.AGG_HEADER_SEQ and
      H.AGG_HEADER_SEQ = 5379
  )

如果您是非甲骨文的人,您会认为我不喜欢摇滚乐,但最后exists条款对于此更新起作用确实是必要的。尝试没有,我的猜测是它将更新表中的每一行具有相同的值或其他不可预测和不可取的东西。