2017-01-08 4 views
2

Alle,eine Tabelle in Oracle Updating basierend auf Daten aus einer anderen Tabelle und 3 Tasten

Hier ist meine zwei Tabellen:

Tabelle Kunde

First_Name | Last_Name | Purchases| Age 
    John  Rambo   10  55 
    George  Washington 17  99 
    Eli   Manning  7  35 

Tabelle Client

First_Name | Last_Name | Purchases| Client_Id | Date_Added 
    John  Rambo   10  4   12-mar-2016 
    George  Washington 17  6   20-jan-2016 
    Eli   Manning  7  3   10-dec-2016 
    Jerry  Seinfeld  4  3   19-mar-2016 

Gewünschtes Ergebnis

Tabelle Kunde:

First_Name | Last_Name | Purchases| Age | Client_Id | Date_Added 
    John  Rambo   10  55  4   12-mar-2016 
    George  Washington 17  99  6   20-jan-2016 
    Eli   Manning  7  35  3   10-dec-2016 

Ich möchte CLIENT_ID und DATE_ADDED zu Kunden hinzuzufügen. Sagen wir, ich habe diese Spalten hinzugefügt und muss nun die Update-Anweisung erstellen. Die Bedingungen lauten: Wenn Vorname oder Nachname oder Käufe in beiden Tabellen übereinstimmen, füllen Sie den Kunden aus. Sagen wir einfach, um Argumente zu sagen, diese Felder werden immer eindeutig sein, also brauchen wir nur eins, um zu passen. Wie würdest du das in Orakel machen? Wohlgemerkt, das wäre für ein paar hunderttausend Datensätze erledigt.

Antwort

1

Mit all Ihren Annahmen, sagen Sie, dass Sie bereits die erforderlichen Spalten hinzugefügt haben, benötigen Sie möglicherweise eine MERGE.

Setup:

create table sustomer(First_Name , Last_Name , Purchases, Age) as (
select 'John' , 'Rambo'  , 10 , 55 from dual union all 
select 'George' , 'Washington' , 17 , 99 from dual union all 
select 'Eli' , 'Manning' , 7 , 35 from dual 
); 
create Table client(First_Name , Last_Name ,Purchases,Client_Id ,Date_Added) as (
select 'John' ,'Rambo'  , 10 , 4 , to_date('12-03-2016','dd-mm-yyyy') from dual union all 
select 'George' ,'Washington' , 17 , 6 , to_date('20-01-2016','dd-mm-yyyy') from dual union all 
select 'Eli' ,'Manning' , 7 , 3 , to_date('10-12-2016','dd-mm-yyyy') from dual union all 
select 'Jerry' ,'Seinfeld' , 4 , 3 , to_date('19-03-2016','dd-mm-yyyy') from dual 
); 
alter table customer add Date_Added date; 
alter table customer add Client_Id number; 

MERGE:

merge into customer cu 
using (select * from client) cl 
on (cl.First_Name = cu.First_Name OR 
    cl.Last_Name = cu.Last_Name OR 
    cl.Purchases = cu.Purchases 
    ) 
when matched then 
    update set Date_Added = cl.Date_Added, 
       Client_Id = cl.Client_Id 

Dies gibt, auf Ihre Daten:

FIRST_ LAST_NAME PURCHASES  AGE CLIENT_ID DATE_ADDE 
------ ---------- ---------- ---------- ---------- --------- 
John Rambo    10   55   4 12-MAR-16 
George Washington   17   99   6 20-GEN-16 
Eli Manning    7   35   3 10-DEC-16 
+0

Ich versuche jetzt das. Beide Tische haben mehr als 500.000 Datensätze, aber unter einer Million, also wird dies hoffentlich nicht viel Zeit in Anspruch nehmen. – DanH

+0

Zusammenführen ist in der Regel schnell. Natürlich hängt es stark von Ihren Tabellen, Indizes, Datenmengen und so weiter ab, wie jede andere Aussage auch. – Aleksej

+0

Geht immer noch. Ich überprüfe regelmäßig alle 30 Minuten und poste ein Update, wenn ich fertig bin. – DanH

Verwandte Themen