Insert 基于列值在表上更新或插入

Insert 基于列值在表上更新或插入,insert,plsql,cursors,Insert,Plsql,Cursors,我有两张基本表和每日表,如下所示: BASE Cust ID IP address 1 10.5.5.5 2 10.5.5.50 3 10.5.5.6 DAILY Cust ID IP address 1 10.5.5.5 2 10.5.5.70 4 10.5.5.67 每天的表格每24小时定期刷新一次。现在,对于BASE中的每个Cust Id,我必须检查IP地址是否每天都被修改。如果是,则

我有两张基本表和每日表,如下所示:

BASE    
Cust ID  IP address
1        10.5.5.5
2        10.5.5.50
3        10.5.5.6

DAILY   
Cust ID  IP address
1        10.5.5.5
2        10.5.5.70
4        10.5.5.67
每天的表格每24小时定期刷新一次。现在,对于BASE中的每个
Cust Id
,我必须检查IP地址是否每天都被修改。如果是,则更新BASE中的行。 每日的所有新条目都必须插入BASE

我已经尝试过使用一个光标进行比较,然后进行更新,然后使用另一个光标进行插入

但这需要很多时间


执行此操作的最佳方法是什么?

如果您只想更新所有
BASE
表,请使用更新来更新
BASE
表中的所有行

UPDATE `BASE`
SET `IP address` = (SELECT `IP address`
                    FROM DAILY
                    WHERE DAILY.`Cust ID` = `BASE`.`Cust ID`);
然后,使用此INSERT INTO查询插入表
BASE
中不存在的新值

INSERT INTO `BASE`
SELECT `Cust ID`, `IP address`
FROM DAILY
WHERE DAILY.`Cust ID` NOT IN (SELECT `Cust ID` FROM BASE);

根据您的数据库系统,您还可以使用
MERGE
。 SQL Server语法将是

MERGE INTO BASE B
USING DAILY D
ON D.CustId = B.CustId
WHEN NOT MATCHED THEN
INSERT (CustId, Ip) VALUES (D.CustId, D.Ip)
WHEN MATCHED AND D.Ip <> B.Ip THEN
UPDATE SET B.Ip = D.Ip;
合并到基B中
使用每日D
在D.CustId=B.CustId上
当不匹配时
插入(CustId,Ip)值(D.CustId,D.Ip)
当匹配和D.Ip B.Ip时
更新集B.Ip=D.Ip;
Oracle PL/SQL语法似乎基本相同,请看一看


SQL>

@user2513495请注意,数据库系统合并可能是原子的,也可能不是原子的,因此请确保在事务和锁定等方面采取适当的操作。
 SQL>
  declare
  begin
  for i in (select * from daily where ip_add not in (select ip_add from base))
  loop
  update base set ip_add=i.ip_add where custid=i.custid;
  end loop;
  end;

PL/SQL procedure successfully completed.

  SQL> select * from base;

    CUSTID IP_ADD
---------- ----------
         1 10..5.5.5
         2 10..5.5.20   -- updated value from base where ip_add is different 
         3 10..5.5.6

 SQL> select * from base  ;

    CUSTID IP_ADD
---------- ----------
         1 10..5.5.5
         2 10..5.5.20
         4 10..5.5.62