2011-11-22 15 views
5

Aşağıdakileri yapmak istiyorum, birincil anahtarlar eşleştiğinde ve etkin 'Y' kaydı olmayan satır yoksa. Mümkün mü?Birleştirme ifadesinde var olmayan IF?

-- 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  | 
+-------+-------------+--------+ 

aynı Kodu etkin kayıt yoktur sadece, bir kayıt eklemek istiyorum:

Bu çalıştı. yeni kayıt O

düzenlemek daha net hale getirir umut bu

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

gibi görünecektir: onun mümkün değildir Aldırma, sadece bu hata mesajı var: türden bir eylem 'INSERT' değil Bir MERGE ifadesinin 'KADAR ZAMAN' maddesinde izin verilir.

+1

Bu değil eserlerini birleştirme nasıl. Geleneksel bir IF kullanmayı düşünün. – Toby

+0

Tablo yapıları örnek verileri ve beklenen sonuç sonucunu anlamak ve cevaplamak için yardımcı olacaktır. –

+0

Gönderiyi düzenleme konusunda sorun yaşamaya devam ettim ancak şu anda bazı örnek veriler var – R2D2

cevap

5

Sizi doğru anlıyorsanız, numaralı @T2 satırlarını Active = 'y' adresinde belirtin.

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 

Sonuç: Kod 3 ile

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

Satır da eklenir. Eğer bunu istemediyseniz,'a bir satır eklemek istiyorsanız, @T2 kodunda bir satır varsa ancak Active = 'n' kodunda bir satır varsa bunu kullanabilirsiniz.

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'); 

Sonuç:

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

Teşekkür ederiz! İkinci senaryonun ihtiyacım olan buydu. Sadece kullandığın seçime ihtiyaç olmadı, ben de bunu bıraktım ve çalışmayı nasıl istediğim işe yarıyor =) – R2D2

İlgili konular