根据列值更新或插入 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>
我有两个 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>