2011-11-22 7 views
5

Chcę wykonać następujące czynności, gdy klucze podstawowe są zgodne i jeśli nie ma żadnych wierszy z aktywnymi wpisami "Y". czy to możliwe?JEŚLI NIE ISTNIEJE w oświadczeniu "Połącz"?

Próbowałem to:

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

tylko wtedy, gdy nie istnieje aktywny rekord z tego samego kodeksu, chcę wstawić rekord. Nowa płyta będzie wyglądać następująco

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

mam nadzieję, że czyni go bardziej jasne

EDIT: Nieważne jej nie możliwe, właśnie ten komunikat o błędzie: Działanie typu „INSERT” nie jest dozwolone w klauzuli WHEN MATCHED instrukcji MERGE.

+1

To nie jest jak połączyć prace. Rozważ użycie tradycyjnego IF. – Toby

+0

Dane przykładowych struktur stolików i oczekiwany efekt końcowy byłyby pomocne w zrozumieniu pytania i udzieleniu odpowiedzi. –

+0

Miałem problemy z edytowaniem mojego posta, ale istnieją pewne przykładowe dane teraz – R2D2

Odpowiedz

5

Jeśli dobrze rozumiem, wstaw wiersze od @T2, które nie są jeszcze w @T1 gdzie 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 

Wynik: zostanie również wprowadzony

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

Wiersz z Kodeksem 3. Jeśli tego nie chcesz, to znaczy, że chcesz wstawić wiersz tylko do @T1, jeśli istnieje już wiersz w @T2 z dopasowaniem kodu, ale Active = 'n' możesz go użyć zamiast tego.

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

Wynik:

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

Dziękuję! Twój drugi scenariusz był tym, czego potrzebowałem. Tylko tam, gdzie użyłeś wyboru, nie było to konieczne, więc zostawiłem to i działa tak, jak chciałem, żeby działało =) – R2D2