Sql 基于相同字段的更新字段不为空
为这个糟糕的标题道歉。不知道如何简洁地表达我的需求。我知道MySQL可以解决这个问题,但它不适用于Oracle 我有一个表,其中我的OrderID字段与订单上的行项目不同。当用户从订单中删除某些行项目并批准订单时,我将获得已批准行项目的完成日期,以及已删除行项目的空值。我需要更新订单上所有行的完成日期。这就是它看起来的样子 这就是我要找的 我发现,如果我选择一个特定的OrderID,代码就会更新,但如果我打开它扫描整个表,显然需要35个小时,这是不可行的Sql 基于相同字段的更新字段不为空,sql,oracle,Sql,Oracle,为这个糟糕的标题道歉。不知道如何简洁地表达我的需求。我知道MySQL可以解决这个问题,但它不适用于Oracle 我有一个表,其中我的OrderID字段与订单上的行项目不同。当用户从订单中删除某些行项目并批准订单时,我将获得已批准行项目的完成日期,以及已删除行项目的空值。我需要更新订单上所有行的完成日期。这就是它看起来的样子 这就是我要找的 我发现,如果我选择一个特定的OrderID,代码就会更新,但如果我打开它扫描整个表,显然需要35个小时,这是不可行的 update batchmgr.udt_
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';
您可以使用:
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是一个字符串。如果没有,请将单引号放在常量比较上。如果同一订单有不同的完成日期,我将使用max:
更新batchmgr.udt\u买方a
set a.completedate=选择maxb.completedate
来自batchmgr.udt\u买方b
其中,b.completedate不为空
b.orderid=a.orderid
其中a.orderid='221292540';
或者,您可以使用分析函数max over创建一个视图,以便在不进行更新的情况下获得相同的视图:
创建或替换“查看订单”项目作为
选择
医嘱ID
买主
,订单类型
项目
,CreateDate
,MaxCompletedAte按医嘱ID作为CompleteDate进行超额分配
来自batchmgr.udt_买方;
但是最好将数据标准化,并将订单与订单项目分开存储。谢谢!由于重复,我不得不在orderid、item和completedate上建立索引,但在这之后它工作得很好