比较两个表并更新Oracle SQL中的不匹配列

vc9ivgsu  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(116)

我要求与一个表进行比较,如果有不匹配的情况,则更新另一个表。表LEGACY_CUST_INFO具有正确的CUST_PRIVILEGE_NUMBER。因此,我需要在第二个表CUST_INFO中找出错误的CUST_PRIVILEGE_NUMBER,并使用第一个表LEGACY_CUST_INFO中正确的CUST_PRIVILEGE_NUMBER进行更新。两个表中的ROW_ID匹配是完全匹配。这两个表都有大约2000万条记录。
下面是两个表结构
表1名称:LEGACY_CUST_INFO

ROW_ID  CUST_PRIVILEGE_NUMBER

表2名称:客户信息

ROW_ID CUST_PRIVILEGE_NUMBER

当我检查下面的语句时,我遇到了性能问题。有没有更好的方法来创建一个包含不匹配记录的表并更新CUST_INFO表中的列CUST_PRIVILEGE_NUMBER?下面是我的代码和逻辑。
1.我正在创建一个表- EXACT_RECORDS,其中包含精确匹配记录。
1.从LEGACY_CUST_INFO表中删除完全匹配的记录。
1.根据LEGACY_CUST_INFO表更新CUST_PRIVILEGE_NUMBER。

CREATE TABLE EXACT_RECORDS
AS
(SELECT A.* FROM LEGACY_CUST_INFO A, CUST_INFO B WHERE A.ROW_ID = B.ROW_ID AND A.CUST_PRIVILEGE_NUMBER = B.CUST_PRIVILEGE_NUMBER);
DELETE FROM LEGACY_CUST_INFO WHERE ROW_ID IN (SELECT ROW_ID FROM EXACT_RECORDS);
UPDATE CUST_INFO B SET B.CUST_PRIVILEGE_NUMBER = (SELECT A.CUST_PRIVILEGE_NUMBER FROM LEGACY_CUST_INFO A WHERE A.ROW_ID = B.ROW_ID);

我知道这个逻辑很基本。你能以更好的方式提供帮助,以便在不到30分钟的时间内更新2000万条记录吗?

mo49yndu

mo49yndu1#

我建议使用一个包含查询的merge语句,返回准备好的不匹配记录进行更新。

merge into cust_info dst
using (
select l.row_id, l.cust_privilege_number
from legacy_cust_info lci
inner join cust_info ci on ci.row_id = lci.row_id
where ci.cust_privilege_number != lci.cust_privilege_number
) src
on (dst.row_id = src.row_id)
when matched then 
  update set dst.cust_privilege_number = src.cust_privilege_number;

还可以考虑为表创建索引:

CREATE INDEX legacy_cust_info#rid#cpn#idx ON LEGACY_CUST_INFO (row_id, cust_privilege_number);
CREATE INDEX cust_info#row_id#idx ON CUST_INFO (row_id);

UPD。您可以通过运行嵌套的select而不将其内容合并到目标表中来估计时间:

select count(1) from (
  select l.row_id, l.cust_privilege_number
   from legacy_cust_info lci
   inner join cust_info ci on ci.row_id = lci.row_id
   where ci.cust_privilege_number != lci.cust_privilege_number
)

UPD2.要考虑ci.cust_privilege_number中的NULL,只需在查询中添加替代条件:

where (
  ci.cust_privilege_number != lci.cust_privilege_number 
  or (
   ci.cust_privilege_number is null 
   and lci.cust_privilege_number is not null
  )
)
cdmah0mi

cdmah0mi2#

索引有助于更快地检索数据。检查以下查询:-
对于row_ID

CREATE INDEX idx_legacy_cust_info_row_id ON LEGACY_CUST_INFO (ROW_ID);
CREATE INDEX idx_cust_info_row_id ON CUST_INFO (ROW_ID);

对于单个update语句,使用两个表之间的联接来更新不匹配的CUST_PRIVILEGE_NUMBER。检查以下查询:-

UPDATE CUST_INFO CI
SET CI.CUST_PRIVILEGE_NUMBER = (
   SELECT LCI.CUST_PRIVILEGE_NUMBER
   FROM LEGACY_CUST_INFO LCI
   WHERE LCI.ROW_ID = CI.ROW_ID
)
WHERE CI.CUST_PRIVILEGE_NUMBER <> (
   SELECT LCI.CUST_PRIVILEGE_NUMBER
   FROM LEGACY_CUST_INFO LCI
   WHERE LCI.ROW_ID = CI.ROW_ID
);

相关问题