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

Oracle MERGE:viene attivato solo NOT MATCHED

Penso che tu abbia frainteso a cosa serve l'unione.

Mi aspetto che il tuo tavolo sia qualcosa del tipo:

CREATE TABLE TABLE_FOR_TESTS (
    d DATE,
    t NUMBER(8),
    CONSTRAINT TABLE_FOR_TESTS_PK PRIMARY KEY (d)
)

e quindi l'istruzione di unione potrebbe essere:

MERGE INTO TABLE_FOR_TESTS t
  USING (SELECT trunc(sysdate) d FROM DUAL) s
    ON (s.d = t.d)
  WHEN MATCHED THEN
    UPDATE SET t = t+1
  WHEN NOT MATCHED THEN         
    INSERT (d, t) VALUES (trunc(sysdate), 1)

dove il join si trova sulla chiave primaria della tabella e si aggiorna o si inserisce a seconda che il record per quel valore PK esista.

Questo avrebbe un massimo di un record al giorno e t conterrebbe il numero di esecuzioni di questa istruzione al giorno (supponendo che nessun altro DML su TABLE_FOR_TESTS).

Nota:sysdate di per sé include un componente temporale. trunc(sysdate) lo rimuove e imposta l'ora su 00:00:00.