2011-11-22 28 views
5

मैं निम्नलिखित करना चाहता हूं, जब प्राथमिक कुंजी मेल खाते हैं और यदि सक्रिय 'वाई' सम्मिलित रिकॉर्ड्स के साथ कोई पंक्ति नहीं है। क्या यह संभव है?अगर मर्ज स्टेटमेंट में मौजूद नहीं है?

मैंने कोशिश की यह:

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

केवल जब वहाँ एक ही कोड के साथ कोई सक्रिय रिकॉर्ड है, मैं एक रिकॉर्ड सम्मिलित करना चाहते हैं। नया रिकार्ड इस

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

मुझे आशा है कि यह और अधिक स्पष्ट

संपादित करता है ऐसा दिखाई देगा: कभी संभव नहीं बात नहीं, मैं तो बस इस त्रुटि संदेश मिला: प्रकार का एक कार्रवाई 'सम्मिलित करें' नहीं है एक बड़े स्टेटमेंट के 'कब मिले' खंड में अनुमति दी गई है।

+1

यह नहीं कैसे काम करता है मर्ज है। एक पारंपरिक आईएफ का उपयोग करने पर विचार करें। – Toby

+0

तालिका संरचना नमूना डेटा और अपेक्षित अंतिम परिणाम आपके प्रश्न को समझने और प्रदान करने और उत्तर देने में सहायक होगा। –

+0

मुझे अपनी पोस्ट संपादित करने में कुछ परेशानी थी लेकिन अब कुछ उदाहरण डेटा है – R2D2

उत्तर

5

यदि मैं आपको सही ढंग से समझता हूं, @T2 से पंक्तियां डालें जो पहले से ही @T1 में 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 

परिणाम: कोड 3 के साथ

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

पंक्ति भी सम्मिलित किया जाएगा। यदि आप यह नहीं चाहते थे, जिसका अर्थ है कि आप केवल @T1 पर एक पंक्ति डालना चाहते हैं, तो कोड पर एक मैच के साथ @T2 में पहले से मौजूद एक पंक्ति मौजूद है लेकिन Active = 'n' आप इसके बजाय इसका उपयोग कर सकते हैं।

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

परिणाम:

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

धन्यवाद! आपकी दूसरी लिपि मुझे जरूरी थी। केवल जहां आपने चयन किया था, की आवश्यकता नहीं थी, इसलिए मैंने इसे छोड़ दिया और यह काम करता है कि मैं इसे कैसे काम करना चाहता था =) – R2D2

संबंधित मुद्दे