sql >> Databasteknik >  >> RDS >> Sqlserver

Varför behöver jag "matcha" delen av en SQL-fusion i det här scenariot?

I svar som du har länkat till i kommentarerna , som jag förhoppningsvis har klargjort, vi missbrukar MERGE uttalande.

Frågan du har visat här kan trivialt ersättas av:

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

Men om du vill kunna lägga till en OUTPUT klausul , och den OUTPUT klausulen måste referera till både nyinfogade data och data från källtabellen får du inte skriva en sådan sats på en INSERT uttalande.

Så vi använder istället en MERGE uttalande, men inte för dess avsedda syfte. Hela syftet är att tvinga den att utföra en INSERT och skriv vår OUTPUT klausul.

Om vi ​​granskar dokumentationen för SAMMANFATTNING , ser vi att den enda satsen där vi kan specificera att utföra en INSERT finns i NÄR INTE MATCHED [BY MÅL] sats - i både WHEN MATCHED och NÄR INTE MATCHAS EFTER KÄLLA klausuler, våra enda alternativ är att UPPDATERA eller DELETE .

Så vi måste skriva MERGE så att matchning alltid misslyckas - och det enklaste sättet att göra det är att säga att matchning ska ske när 1 =0 - vilket förhoppningsvis aldrig är det.

Eftersom SQL Server inte stöder boolean literals




  1. hur man infogar indisk språk telugu tecken i mysql

  2. T-SQL MELLAN problem maxvärde först

  3. kan inte komma åt fortrabbit mysql db via terminal (ssh)

  4. SQL LOOP INSERT Baserat på lista över ID