2015-05-02 5 views
0

У меня есть две таблицы, база и ежедневно, как показано ниже:Обновление или Вставить в таблице на основе значения столбца

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 часа. Теперь для каждого Cust Id в BASE мне нужно проверить, изменен ли IP-адрес в DAILY. Если да, то обновите строку на BASE. Все новые записи в DAILY должны быть вставлены на BASE.

Я пробовал это, используя Курсор, сравнивая, а затем обновляя, а затем еще один курсор для вставки.

Но это занимает много времени.

Каков наилучший способ для этого?

ответ

0

Вы также можете использовать 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; 

Oracle PL/SQL синтаксис, как представляется, так же, посмотрите here

+0

спасибо. Было очень полезно – user2513495

+0

@ user2513495 имейте в виду, что в зависимости от вашей системы базы данных MERGE может быть или не быть атомарным, поэтому убедитесь, что вы принимаете подходящее действие с точки зрения транзакции и блокировки и т. Д. – CodeMonkey

0

Если вы хотите обновить всю свою таблицу BASE, используйте UPDATE, чтобы обновить все строки в таблице 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); 
0
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>