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

Unisci e unisci si uniscono allo stesso modo in SQL Server?

UNISCI è un'istruzione DML (linguaggio di manipolazione dei dati).
Chiamato anche UPSERT (Update-Insert).
Cerca di abbinare l'origine (tabella / vista / query) a una destinazione (tabella / vista aggiornabile) in base a le condizioni definite e quindi, in base ai risultati corrispondenti, inserisce/aggiorna/elimina le righe in/in/della tabella di destinazione.
MERGE (Transact-SQL)

create table src (i int, j int);
create table trg (i int, j int);

insert into src values (1,1),(2,2),(3,3);
insert into trg values (2,20),(3,30),(4,40);

merge into  trg
using       src
on          src.i = trg.i
when not matched by target then insert (i,j) values (src.i,src.j)
when not matched by source then update set trg.j = -1
when matched then update set trg.j = trg.j + src.j
;

select * from trg order by i

+---+----+
| i | j  |
+---+----+
| 1 | 1  |
+---+----+
| 2 | 22 |
+---+----+
| 3 | 33 |
+---+----+
| 4 | -1 |
+---+----+

UNISCI UNISCI è un algoritmo di join (ad es. HASH JOIN o NESTED LOOPS).
Si basa prima sull'ordinamento di entrambi i set di dati in base alle condizioni di join (forse già ordinati a causa dell'indice esistente) e quindi sull'attraversamento dei set di dati ordinati e sulla ricerca di corrispondenze.

create table t1 (i int)
create table t2 (i int)

select * from t1 join t2 on t1.i = t2.i option (merge join)

create table t1 (i int primary key)
create table t2 (i int primary key)

select * from t1 join t2 on t1.i = t2.i option (merge join)

In SQL Server una chiave primaria implica una struttura di indice cluster, il che significa che la tabella è archiviata come un albero B, ordinata in base alla chiave primaria.

Informazioni sull'unione di join