【问题标题】:Update Field based on Same Field not Null基于相同字段更新字段不为空
【发布时间】:2021-04-22 14:36:02
【问题描述】:

为糟糕的标题道歉。不知道如何简洁地表达我的需求。我知道 MySQL 可以解决这个问题,但它不适用于 Oracle

我有一个表格,其中我的 OrderID 字段与订单上的订单项不同。当用户从订单中删除某些行项目并批准订单时,我会获得已批准行项目的完成日期,以及已删除行项目的空值。我需要更新该订单上所有行的完成日期。这就是它的样子

这就是我要找的东西

如果我选择特定的 OrderID,我发现代码会更新,但如果我打开它扫描整个表,则需要 35 小时(显然不可行)

update batchmgr.udt_buyer a set a.completedate=(select b.completedate from batchmgr.udt_buyer b where b.completedate is not null and b.orderid=a.orderid) where a.orderid ='221292540';

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可以使用:

    update batchmgr.udt_buyer b
        set completedate = (select b2.completedate
                            from batchmgr.udt_buyer b2
                            where b2.completedate is not null and
                                  b2.orderid = b.orderid and
                                  rownum = 1
                           )
        where b.orderid = '221292540' and b.completedate is null;
    

    为了提高性能,您需要在(orderid, completate) 上建立索引。

    另外,请确保 orderid 是一个字符串。如果不删除常量 coparison 上的单引号。

    【讨论】:

    • 谢谢!由于重复,我不得不对 orderid、item 和 completeate 进行索引,但在那之后它工作得很好
    【解决方案2】:

    我会使用max() 以防万一您对同一订单有不同的完成日期:

    update batchmgr.udt_buyer a 
    set a.completedate=(select max(b.completedate)
                        from   batchmgr.udt_buyer b 
                        where b.completedate is not null 
                          and b.orderid=a.orderid) 
    where a.orderid ='221292540';
    

    或者您可以创建一个带有解析函数max() over 的视图以在不更新的情况下获得相同的结果:

    create or replace view v_order_items as 
    select
        OrderId
        ,Buyer
        ,OrderType
        ,Item
        ,CreateDate
        ,max(CompleteDate)over(partition by OrderId) as CompleteDate
    from batchmgr.udt_buyer;
    

    但最好规范化您的数据并将订单与订单商品分开存储。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 2014-12-13
      • 2014-12-25
      • 2021-06-21
      • 1970-01-01
      • 2018-04-09
      • 2022-12-12
      • 2011-12-05
      相关资源
      最近更新 更多