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

Perché ho bisogno della parte "corrispondenza" di un'unione SQL, in questo scenario?

In risposta a cui ti sei collegato nei commenti , come spero di aver chiarito, stiamo abusando il MERGE dichiarazione.

La query che hai mostrato qui potrebbe essere banalmente sostituita da:

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

Tuttavia, se desideri essere in grado di aggiungere un OUTPUT clausola e quel OUTPUT la clausola deve fare riferimento sia ai dati appena inseriti che dati dalla tabella di origine, non sei autorizzato a scrivere tale clausola su un INSERT dichiarazione.

Quindi, utilizziamo invece un MERGE dichiarazione, ma non per lo scopo previsto. L'intero scopo è forzarlo a eseguire un INSERT e scrivi il nostro OUTPUT clausola.

Se esaminiamo la documentazione per MERGE , vediamo che l'unica clausola in cui possiamo specificare di eseguire un INSERT è nel WHEN NOT MATCHED [BY TARGET] clausola - in entrambi WHEN MATCHED e WHEN NOT MATCHED BY SOURCE clausole, le nostre uniche opzioni sono UPDATE o DELETE .

Quindi, dobbiamo scrivere MERGE in modo tale che la corrispondenza fallisca sempre - e il modo più semplice per farlo è dire che la corrispondenza dovrebbe verificarsi quando 1 = 0 - che, si spera, non è mai.

Poiché SQL Server non supporta letterali booleani