sql >> Databáze >  >> RDS >> Oracle

Oracle MERGE:je spuštěno pouze NOT MATCHED

Myslím, že jste špatně pochopili, k čemu slouží sloučení.

Očekával bych, že váš stůl bude něco jako:

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

a potom příkaz merge by mohl být:

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)

kde je spojení na primárním klíči tabulky a buď se aktualizuje, nebo vkládá v závislosti na tom, zda záznam pro danou hodnotu PK existuje.

To by mělo maximálně jeden záznam za den a t by obsahovalo počet provedení tohoto příkazu za den (za předpokladu, že na TABLE_FOR_TESTS není žádný jiný DML).

Poznámka:sysdate sám o sobě obsahuje časovou komponentu. trunc(sysdate) jej odstraní a nastaví čas na 00:00:00.




  1. Jak odstranit řádek tabulky, pokud je pole post_title duplikováno v jiném řádku?

  2. Připojte se ke sloupci s dotazem SELECT v PostgreSQL

  3. Získejte aktuální ID uživatelů z databáze pro použití v nové tabulce

  4. PostgreSQL json_array_elements v klauzuli FROM – proč toto není kartézské spojení?