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