Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum benötige ich in diesem Szenario den „Match“-Teil einer SQL-Zusammenführung?

Im Antwort, die Sie in den Kommentaren verlinkt haben , wie ich hoffentlich deutlich gemacht habe, missbrauchen wir das MERGE Aussage.

Die hier gezeigte Abfrage könnte trivialerweise ersetzt werden durch:

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

Wenn Sie jedoch eine OUTPUT Klausel , und das OUTPUT -Klausel muss auf die neu eingefügten Daten und verweisen Daten aus der Quelltabelle, dürfen Sie eine solche Klausel nicht in ein INSERT schreiben Aussage.

Also verwenden wir stattdessen ein MERGE Aussage, aber nicht für den beabsichtigten Zweck. Der gesamte Zweck besteht darin, es zu zwingen, ein INSERT auszuführen und schreiben Sie unsere OUTPUT Klausel.

Wenn wir die Dokumentation für MERGE untersuchen , sehen wir, dass dies die einzige Klausel ist, in der wir angeben können, dass ein INSERT ausgeführt werden soll ist in WHEN NOT MATCHED [BY TARGET] -Klausel - sowohl in WHEN MATCHED und WHEN NOT MATCHED BY SOURCE -Klauseln sind unsere einzigen Optionen UPDATE oder DELETE .

Also müssen wir den MERGE schreiben so dass der Abgleich immer fehlschlägt - und der einfachste Weg, dies zu tun, ist zu sagen, dass der Abgleich erfolgen sollte, wenn 1 = 0 - was hoffentlich nie der Fall ist.

Da SQL Server boolesche Literale nicht unterstützt