Oracle 更新 sql 查询

Oracle update sql query

我的查询是这样的。它没有显示错误。但是执行时间很长,我被迫关闭。请检查

update trans_rec a
set a.qty = (select b.qtydes from itbg_store_delchellan b where b.icode = 
a.icode and a.controlno=b.DEL_NO AND A.controlno IS NOT NULL) 
where exists 
    (select b.qtydes from itbg_store_delchellan b where b.icode = a.icode and 
    a.controlno=b.DEL_NO  AND A.controlno IS NOT NULL )

试试这个更新:

UPDATE A
SET     qty = B.qtydes 
from    trans_rec AS A
INNER JOIN itbg_store_delchellan B
             ON B.icode = A.icode 
             AND A.controlno=b.DEL_NO 
             AND A.controlno IS NOT NULL        

您可以按如下方式重新编写查询:

UPDATE trans_rec a
SET a.qty =
    (SELECT b.qtydes 
    FROM itbg_store_delchellan b
    WHERE b.icode = a.icode and a.controlno=b.DEL_NO) 
WHERE a.controlno IS NOT NULL
AND EXISTS
(SELECT b.qtydes FROM itbg_store_delchellan b
WHERE b.icode = a.icode AND a.controlno=b.DEL_NO)

在此之后,您必须在字段搜索中添加索引,如下所示:

在这些字段上添加以下过滤器

  • b.icode
  • a.controlno
  • a.icode

您可以在 Oracle 中使用 MERGE 语句。

MERGE INTO trans_rec t USING 
( select DISTINCT icode,del_no,qtydes
       FROM itbg_store_delchellan s 
)
ON (
     s.icode = t.icode AND t.controlno = s.del_no
)
WHEN MATCHED THEN UPDATE SET t.qty = s.qtydes
WHERE t.controlno IS NOT NULL

要提高性能,请在 itbg_store_delchellan 上创建复合索引:

create index idx_itbg_store_delchellan_3 on itbg_store_delchellan(icode, del_no, qtydes)

请注意条件 A.controlno IS NOT NULL 是多余的。关联条件已经过滤掉 NULL 值,因此您可以从两个子查询中删除它。