sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor har jeg brug for 'match'-delen af ​​en SQL-fletning i dette scenarie?

I svar, du har linket til i kommentarerne , som jeg forhåbentlig har gjort det klart, misbruger vi FLET erklæring.

Den forespørgsel, du har vist her, kunne trivielt erstattes af:

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

Men hvis du ønsker at kunne tilføje en OUTPUT klausul , og den OUTPUT klausul skal referere til både de nyligt indsatte data og data fra kildetabellen, har du ikke tilladelse til at skrive en sådan klausul på en INSERT erklæring.

Så vi bruger i stedet en MERGE erklæring, men ikke til dets tilsigtede formål. Hele formålet er at tvinge den til at udføre en INSERT og skriv vores OUTPUT klausul.

Hvis vi undersøger dokumentationen for FLET , ser vi, at den eneste klausul, hvor vi kan specificere at udføre en INSERT er i NÅR IKKE MATCHED [BY MÅL] klausul - i både WHEN MATCHED og NÅR IKKE MATCHES EFTER KILDE klausuler, er vores eneste muligheder at OPDATERE eller SLET .

Så vi er nødt til at skrive MERGE sådan, at matchning altid mislykkes - og den enkleste måde at gøre det på er at sige, at matchning skal ske, når 1 =0 - hvilket forhåbentlig aldrig er.

Da SQL Server ikke understøtter boolean literals




  1. Hvordan kan jeg finde IP-adressen på den aktuelle brugers forbindelse i MySQL?

  2. MYSQL - Ændring af årstal fra 2020 til 2011

  3. Optimering af forespørgsler baseret på klyngede og ikke-klyngede indekser i SQL?

  4. Azure Virtual Machine Developments til SQL Server-brug