2011-11-22 1 views
5

Desidero eseguire le seguenti operazioni, quando le chiavi primarie corrispondono e se non ci sono righe con "Y" attivo, inserire i record. È possibile?SE NON ESISTE nell'istruzione Merge?

ho provato questo:

-- Merge statement 
MERGE INTO table1 AS DST 
USING table2 AS SRC 
ON (SRC.Code = DST.Code) 

--Existing records updated if data changes 
WHEN MATCHED 
AND IF NOT EXISTS (WHERE active='Y' FROM table1) 

THEN 
INSERT INTO table1 (colum) 
SELECT value 

+-------+-------------+--------+ 
| Code | description | Active | 
+-------+-------------+--------+ 
| AB | just  | | 
|  | something | No  | 
+-------+-------------+--------+ 

solo quando non v'è alcun record attivo con lo stesso codice, voglio inserire un record. Il nuovo record sarebbe simile a questa

+-------+-------------+--------+ 
| Code | description | Active | 
+-------+-------------+--------+ 
| AB | something | | 
|  | else  | YES | 
+-------+-------------+--------+ 

Spero che lo rende più chiaro

edit: Non importa la sua non è possibile, ho appena ricevuto questo messaggio di errore: Un'azione di tipo 'Inserisci' non è ammesso nella clausola 'WHEN MATCHED' di un'istruzione MERGE.

+1

Questo non è come unire le opere è. Prendi in considerazione l'utilizzo di un IF tradizionale. – Toby

+0

I dati di esempio delle strutture di tabelle e il risultato finale atteso potrebbero essere utili per comprendere la domanda e fornire e rispondere. –

+0

Ho avuto qualche problema nel modificare il mio post ma ora ci sono alcuni dati di esempio – R2D2

risposta

5

Se ho capito bene, inserire righe da @T2 che non è già in @T1 dove Active = 'y'.

declare @T1 table 
(
    Code char(2), 
    Descr varchar(10), 
    Active char(1) 
) 

declare @T2 table 
(
    Code char(2), 
    Descr varchar(10) 
) 

insert into @T1 values 
('1', 'Desc 1', 'y'), 
('2', 'Desc 2', 'n') 

insert into @T2 values 
('1', 'Desc 1'), 
('2', 'Desc 2'), 
('3', 'Desc 3') 

merge @T1 as D 
using @T2 as S 
on D.Code = S.Code and 
    D.Active = 'y' 
when not matched then 
    insert (Code, Descr, Active) 
    values (Code, Descr, 'y'); 

select * 
from @T1 

Risultato: verrà inserito anche

Code Descr  Active 
---- ---------- ------ 
1 Desc 1  y 
2 Desc 2  n 
2 Desc 2  y 
3 Desc 3  y 

Row con codice 3. Se non lo volevi, vuol dire che vuoi solo inserire una riga su @T1 se esiste già una riga in @T2 con una corrispondenza sul codice ma Active = 'n' puoi invece usarla.

merge @T1 as D 
using (select Code, 
       Descr 
     from @T2 
     where Code in (select Code 
         from @T1 
         where Active = 'n')) as S 
on D.Code = S.Code and 
    D.Active = 'y' 
when not matched then 
    insert (Code, Descr, Active) 
    values (Code, Descr, 'y'); 

Risultato:

Code Descr  Active 
---- ---------- ------ 
1 Desc 1  y 
2 Desc 2  n 
2 Desc 2  y 
+0

Grazie! Il tuo secondo script era quello di cui avevo bisogno. Solo dove hai usato select non era necessario, quindi l'ho lasciato fuori e funziona come volevo che funzionasse =) – R2D2