ORA-30.926 errore come risultato di una operazione Merge

ORA-30.926 errore si verifica di solito quando le operazioni di unione, ed è normale che ci lasciano un po 'fuori luogo, poiché la descrizione di essa non dà molte informazioni su quanto sta accadendo:
ORA-30.926: in grado di arrivare a stabile nel mese di settembre di righe in tabelle di origine.

Normalmente questo errore si verifica quando l'operazione di merge per una riga di destinazione per essere aggiornato sotto di lui più di una riga nella tabella di origine. Mentre il motore non sa quale scegliere record restituisce un errore. E 'un problema di duplicazione della tabella di origine.

Esempio:

  • Abbiamo:
    TABLA_ORIGENcon valori
    ID Descrizione
    1 'Il primo valore'
    1 'Il valore id raddoppiato'
    2 'Un altro valore' E con i valori TABLA_DESTINO
    ID Descrizione
    1 'Rapporto di aggiornamento'
    2 'Questo disturbo non si'
    3 'Questo rimane lo stesso'
  • Vogliamo unire utilizzando la seguente dichiarazione:

Si fondono in dest TABLA_DESTINO
UTILIZZO TABLA_ORIGEN ori
ON (= dest.ID ori.ID)
QUANDO MATCHED THEN UPDATE a.Descripcion SET b.Descripcion =;

Con questi dati si ottiene il seguente errore TABLA_ORIGEN:
ORA-30.926: impossibile ottenere un insieme stabile di righe in tabelle di origine

  • Dato questo errore abbiamo 3 opzioni: 1 -.Eliminare i record duplicati dalla tabella di origine:

TABLA_ORIGEN DELETE FROM WHERE id = 1 Descrizione e = 'Il valore id raddoppiato'

2 -. Rivedere il motivo fondamentale per cui noi facciamo il join nella stampa unione:

Se vogliamo utilizzare il campo Descrizione sul link e ci sarà solo zero o una fonte di record per ogni destinazione:

Si fondono in dest TABLA_DESTINO
UTILIZZO TABLA_ORIGEN ori
ON (dest.Descripcion E ori.ID dest.ID = = ori. Descrizione)
QUANDO MATCHED THEN UPDATE a.Descripcion SET b.Descripcion =;

(Questo esempio non ha molto senso perché la tabella è solo questi due settori, e anche il join non trova corrispondenze)

3 -.Usa MERGE invece di un UPDATE con JOIN e HINT / + BYPASS_UJVC * * / per saltare il motore di validazione, e incrocia le dita:

UPDATE / * + * BYPASS_UJVC /
(SELECT ori.ID ori_ID,
& Nb
sp; ori_Descripcion ori.Descripcion,
dest.ID dest_ID,
dest_Descripcion dest.Descripcion
DA TABLA_ORIGEN Ori, dest TABLA_DESTINO
DOVE ori.ID = dest.ID)
SET dest_Descripcion = ori_Descripcion;

Ovviamente i più consigliati sono il primo o il secondo, a seconda dei casi.