2016-06-30 9 views
0

Ich habe dieses Problem mit PL/SQL. Ich habe 2 Tabellen mit derselben Spalte. Einer ist für den aktuellen Lauf, der andere für die Geschichte.Aktualisieren Sie mehrere Werte mit where exists Klausel

Bei jedem Lauf muss ich den Verlauf nur mit Werten aktualisieren, die ich im aktuellen Lauf gefunden habe.

Aktuelle Tabelle

| ID |__NAME__|__SURNAME__|__CITY__| 
| 10000 | ABC | CDE  | IT | 
| 10001 | EFG | ASD  | EN | 
| 10005 |  |   |  | 

Geschichte Tabelle

| ID |__NAME__|__SURNAME__|__CITY__| 
| 10000 | FFF | AAA | EN | 
| 10001 | DDD | BBB | GR | 
| 10005 | JKO | POI | GR | 
| 10006 | DLK | MIN | IT | 

Wie Sie sehen können, Aktuelle Tabelle hat einen Datensatz mit allen leeren Werten, außer ID = 10005. Also, ich muss Geschichte (Name, Vorname, Stadt) von der aktuellen Tabelle aktualisieren, wo ID in der aktuellen Tabelle vorhanden ist und Name, Nachname und Stadt sind nicht null.

Ich habe versucht, mit

UPDATE HISTORY 
    SET (NAME, SURNAME, CITY) = (
     SELECT NAME, SURNAME, CITY 
     FROM CURRENT temp 
     WHERE temp.name is not null and temp.id = history.id 
     ) 
    WHERE exists (
     SELECT NAME, SURNAME, CITY 
     FROM CURRENT temp 
     WHERE temp.name is not null and temp.id = history.id 
    ); 

Aber es funktioniert nicht. Ich muss unterstreichen, dass wenn Name in der aktuellen Tabelle null ist, dann Nachname und Stadt auch null sind.

+0

Sie MySQL oder Postgres? –

+0

PLSQL- Ich werde meine Frage bearbeiten –

+0

Meinst du Oracle SQL? – Mottor

Antwort

1

Eigentlich ist der einzige Fehler in Ihrer Abfrage der Name der Tabelle CURRENT. Es ist ein reserviertes Wort in Oracle und es wird nicht empfohlen, es als Tabellenname zu verwenden. Du musst "" verwenden, um zu arbeiten. Hier:

UPDATE HISTORY 
    SET (NAME, SURNAME, CITY) = (
     SELECT NAME, SURNAME, CITY 
     FROM "CURRENT" temp 
     WHERE temp.name is not null and temp.id = history.id 
     ) 
    WHERE exists (
     SELECT NAME, SURNAME, CITY 
     FROM "CURRENT" temp 
     WHERE temp.name is not null and temp.id = history.id 
    ); 

Sie MERGE verwenden (Siehe Plan für beide erklären):

MERGE INTO HISTORY_TABLE a 
    USING (SELECT ID, NAME, SURNAME, CITY 
       FROM CURRENT_TABLE 
      WHERE NAME IS NOT NULL) b 
     ON (a.id = b.id) 
WHEN MATCHED THEN 
    UPDATE SET a.NAME = b.NAME, a.SURNAME = b.SURNAME, a.CITY = b.CITY