根据列值更新或插入 Table

Update or Insert on a Table based on a column value

我有两个 tables BASE 和 DAILY,如下所示:

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

tableDAILY 每 24 小时定期刷新一次。现在,对于 BASE 中的每个 Cust Id,我必须每天检查 IP 地址是否被修改。如果是,则更新 BASE 中的行。 DAILY 中的所有新条目都必须插入到 BASE 中。

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

但这要花很多时间。

最好的方法是什么?

如果您只想更新所有 BASE table,请使用 UPDATE 更新 BASE table.

中的所有行
UPDATE `BASE`
SET `IP address` = (SELECT `IP address`
                    FROM DAILY
                    WHERE DAILY.`Cust ID` = `BASE`.`Cust ID`);

然后,使用此 INSERT INTO 查询插入 table BASE.

中不存在的新值
INSERT INTO `BASE`
SELECT `Cust ID`, `IP address`
FROM DAILY
WHERE DAILY.`Cust ID` NOT IN (SELECT `Cust ID` FROM BASE);

您也可以使用 MERGE,具体取决于您的数据库系统。 SQL 服务器语法为

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;

Oracle PL/SQL语法好像大同小异,看看here

 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

SQL>