sql >> Databáze >  >> RDS >> Sqlserver

Proč v tomto scénáři potřebuji 'match' část sloučení SQL?

V odpověď, na kterou jste odkazovali v komentářích , jak jsem snad již objasnil, zneužíváme SLOUČIT prohlášení.

Dotaz, který jste zde zobrazili, lze triviálně nahradit:

insert into T(Col1) select Col1 from T where ID = 123

Pokud však chcete mít možnost přidat OUTPUT doložka a VÝSTUP klauzule musí odkazovat na nově vložená data a data ze zdrojové tabulky, nemůžete takovou klauzuli napsat do INSERT prohlášení.

Místo toho tedy používáme MERGE prohlášení, ale ne pro zamýšlený účel. Celý účel je donutit jej provést INSERT a napište náš OUTPUT doložka.

Pokud prozkoumáme dokumentaci pro MERGE , vidíme, že jediná klauzule, ve které můžeme zadat provedení INSERT je v KDYŽ NENÍ SHODA [PODLE CÍLE] klauzule - v obou WHEN MATCHED a KDYŽ NENÍ SHODA PODLE ZDROJA klauzule, naše jediná možnost je UPDATE nebo DELETE .

Musíme tedy napsat MERGE takové, že shoda vždy selže – a nejjednodušší způsob, jak to udělat, je říci, že shoda by měla nastat, když 1 =0 - což, doufejme, nikdy není.

Protože SQL Server nepodporuje booleovské literály




  1. Vracení výsledků dotazu v předdefinovaném pořadí

  2. Operaci nebylo možné provést, protože poskytovatel OLE DB SQLNCLI10 pro propojený server (null) nemohl zahájit distribuovanou transakci

  3. Jak rozdělit postgresovou tabulku pomocí mezilehlé tabulky

  4. Jak získat celé číslo z MySQL jako celé číslo v PHP?