Oracle
 sql >> Database >  >> RDS >> Oracle

La query di Oracle SQL Update richiede giorni per l'aggiornamento

Puoi provare questo

  1  MERGE
  2     INTO  target_table tgt
  3     USING source_table src
  4     ON  ( src.object_id = tgt.object_id )
  5  WHEN MATCHED
  6  THEN
  7     UPDATE
  8     SET   tgt.object_name = src.object_name
  9     ,     tgt.object_type = src.object_type
 10  WHEN NOT MATCHED
 11  THEN
 12     INSERT ( tgt.object_id
 13            , tgt.object_name
 14            , tgt.object_type )
 15     VALUES ( src.object_id
 16            , src.object_name
 17            , src.object_type );

La sintassi all'inizio sembra un po' scoraggiante, ma se leggiamo dall'alto verso il basso, è abbastanza intuitiva. Nota le seguenti clausole:

•MERGE (riga 1):come affermato in precedenza, questa è ora la 4a istruzione DML in Oracle. Eventuali suggerimenti che potremmo voler aggiungere seguono direttamente questa parola chiave (es. MERGE /*+ HINT */);

•INTO (riga 2):ecco come specifichiamo il target per il MERGE. La destinazione deve essere una tabella o una vista aggiornabile (qui non è possibile utilizzare una vista in linea);

•USING (riga 3):la clausola USING rappresenta il dataset di origine per MERGE. Può essere una singola tabella (come nel nostro esempio) o una vista in linea;

•ON () (riga 4):la clausola ON è dove forniamo il join tra il dataset di origine e la tabella di destinazione. Tieni presente che le condizioni di unione devono essere tra parentesi;

•WHEN MATCHED (riga 5):questa clausola è dove istruiamo Oracle su cosa fare quando abbiamo già un record corrispondente nella tabella di destinazione (cioè c'è un join tra i dataset di origine e di destinazione). Ovviamente vogliamo un AGGIORNAMENTO in questo caso. Una delle restrizioni di questa clausola è che non possiamo aggiornare nessuna delle colonne utilizzate nella clausola ON (anche se ovviamente non è necessario poiché corrispondono già). Qualsiasi tentativo di includere una colonna di join solleverà un'eccezione non intuitiva di identificatore non valido; e

•WHEN NOT MATCHED (riga 10):questa clausola è dove INSERT record per i quali non esiste una corrispondenza corrente.