sql >> Database >  >> RDS >> Sqlserver

Waarom heb ik in dit scenario het 'match'-gedeelte van een SQL-samenvoeging nodig?

In de antwoord waarnaar u heeft gelinkt in de opmerkingen , zoals ik hopelijk duidelijk heb gemaakt, misbruiken de MERGE verklaring.

De zoekopdracht die u hier heeft weergegeven, kan triviaal worden vervangen door:

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

Als u echter een OUTPUT clausule , en dat OUTPUT clausule moet verwijzen naar zowel de nieuw ingevoegde gegevens en gegevens uit de brontabel, mag u zo'n clausule niet schrijven op een INSERT verklaring.

Dus gebruiken we in plaats daarvan een MERGE verklaring, maar niet voor het beoogde doel. Het hele doel is om het te dwingen een INSERT . uit te voeren en schrijf onze OUTPUT clausule.

Als we de documentatie voor MERGE onderzoeken , zien we dat de enige clausule waarin we kunnen specificeren om een ​​INSERT . uit te voeren is in de WHEN NOT MATCHED [BY TARGET] clausule - in zowel de WHEN MATCHED en WHEN NOT MATCHED BY SOURCE clausules, zijn onze enige opties om UPDATE of DELETE .

We moeten dus de MERGE . schrijven zodat het matchen altijd mislukt - en de eenvoudigste manier om dat te doen is door te zeggen dat het matchen moet plaatsvinden wanneer 1 = 0 - wat hopelijk nooit is.

Aangezien SQL Server boolean literalen niet ondersteunt




  1. mysql-query om veld bij te werken naar max (veld) + 1

  2. Kan de plv8 JavaScript-taalextensie bibliotheken van derden aanroepen?

  3. Converteer datetime-veld naar alleen een datumveld in SQL (Oracle)

  4. SQL-subquery retourneert meer dan 1 rij