【问题标题】:Oracle merge sql doesn't work when update with where condtions使用where条件更新时Oracle合并sql不起作用
【发布时间】:2020-03-17 06:39:03
【问题描述】:

我的问题是当我使用 where 条件更新时发生错误。

错误信息是 00936. 00000 - “缺少表达式”

如果我删除这一行 where q1.SALE_QTY <> -9 ,那么该 sql 可以工作。

数据库版本:oracle 9i SQL:

merge into TBL_QTY q1
using (
select 'A111' as prod_no
       ,'BAT0000171624' as part_batch_no
       ,'172' as cond1_type
       ,'20201225' as beg_dt  
      ,'20201225' as end_dt
      , 17 as obtain_qty
      , 17 as sale_qty ) q2
      on 
(  q1.PROD_NO = q2.PROD_NO
  and q1.PART_BATCH_NO = q2.PART_BATCH_NO
  and q1.COND1_TYPE = q2.COND1_TYPE
  and q1.BEG_DT = q2.BEG_DT
  and q1.END_DT= q2.END_DT)
WHEN MATCHED THEN 
   update  SET q1.OBTAIN_QTY    = 15     
               ,q1.SALE_QTY      = 15 
               where q1.SALE_QTY <> -9
WHEN NOT MATCHED THEN
   INSERT (PROD_NO, PART_BATCH_NO, COND1_TYPE, BEG_DT
           ,END_DT , OBTAIN_QTY   , SALE_QTY           )
   VALUES (q2.PROD_NO, q2.PART_BATCH_NO, q2.COND1_TYPE, q2.BEG_DT
           ,q2.END_DT , q2.OBTAIN_QTY   , q2.SALE_QTY           );

【问题讨论】:

  • merge 语句根本不支持 Oracle 9 的 UPDATE 部分中的 WHERE 子句 docs.oracle.com/cd/B10501_01/server.920/a96540/…
  • 谢谢!!有什么方法可以帮助实现我的目的?根据条件进行更新。
  • 一种选择是使用单独的 UPDATE 和 INSERT 语句。
  • Oracle 10g 可以选择将 WHERE 子句与合并语句一起使用。你可以参考-oracle-base.com/articles/10g/merge-enhancements-10g。所以另一个选择是升级版本,因为 9i 太旧了,现在无法使用。
  • @AnkitBajpai:“因为 9i 太旧了,现在无法使用”——Oracle 10(和 11)也是如此

标签: oracle oracle9i sql-merge


【解决方案1】:

实现相同行为的一种方法是在MERGE 语句的UPDATE 子句中使用CASE..WHEN,如下所示。

...
...
WHEN MATCHED THEN 
   update  SET q1.OBTAIN_QTY = CASE WHEN q1.SALE_QTY <> -9 THEN 15 ELSE q1.OBTAIN_QTY END
               ,q1.SALE_QTY  = CASE WHEN q1.SALE_QTY <> -9 THEN 15 ELSE q1.SALE_QTY END
              -- where q1.SALE_QTY <> -9
WHEN NOT MATCHED THEN
...
...

干杯!!

【讨论】:

  • 它几乎达到了我的目的。但是当case不在“case when”中时,会出现“cannot udpate to null”的错误。其实我想要的是当 qty != -9 时什么都不做
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多