2013-04-19 3 views
14

मैं SQL सर्वर में विलय चला रहा हूं। मेरे अपडेट में, यदि मूल्य बदल गए हैं तो मैं केवल पंक्ति को अपडेट करना चाहता हूं। एक संस्करण पंक्ति है जो प्रत्येक अद्यतन पर वृद्धि करती है।मर्ज करें - केवल तभी अपडेट करें जब मान बदल गए हैं

MERGE Employee as tgt USING 
(SELECT Employee_History.Emp_ID 
, Employee_History.First_Name 
, Employee_History.Last_Name 
FROM Employee_History) 
as src (Emp_ID,First_Name,Last_Name) 
ON tgt.Emp_ID = src.Emp_ID 
WHEN MATCHED THEN 
    UPDATE SET 
    Emp_ID = src.Emp_ID, 
    ,[VERSION] = tgt.VERSION + 1 
    ,First_Name = src.First_Name 
    ,Last_Name = src.Last_Name 
WHEN NOT MATCHED BY target THEN 
    INSERT (Emp_ID,0,First_Name,Last_Name) 
VALUES 
    (src.Emp_ID,[VERSION],src.First_Name,src.Last_Name); 

अब, अगर मैं केवल पंक्ति, और इस तरह वेतन वृद्धि संस्करण को अद्यतन करना चाहता था, केवल अगर नाम बदल गया है: नीचे एक उदाहरण है।

उत्तर

25

WHEN MATCHEDAND हो सकता है। इसके अलावा, EMP_ID को अपडेट करने की कोई आवश्यकता नहीं है।

... 
WHEN MATCHED AND (trg.First_Name <> src.First_Name 
    OR trg.Last_Name <> src.Last_Name) THEN UPDATE 
    SET 
    [VERSION] = tgt.VERSION + 1 
    ,First_Name = src.First_Name 
    ,Last_Name = src.Last_Name 
... 

LAST_NAME या FIRST_NAME नल हैं, तो आप, trg.Last_Name <> src.Last_Name की तुलना करते हुए उदाहरण ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')

+0

के बजाय @ a1ex07 के उत्तर का उपयोग करूंगा, क्या यह एक 'या' होना चाहिए? अगर सिर्फ पहला नाम बदल गया है, तो भी मैं – TrialAndError

+0

@ परीक्षण और त्रुटि अपडेट करना चाहता हूं: हाँ, आप सही हैं। फिक्सिंग ... – a1ex07

+0

मुझे लगता है कि यह पूरी तरह से काम करेगा। मुझे एहसास नहीं हुआ कि मैच किए गए हिस्से पर 'और' हो सकता है। धन्यवाद। – TrialAndError

1

बल्कि पूरी तरह एक अद्यतन से बचने के बजाय, आप शून्य जोड़ने के लिए अपने [VERSION] + 1 कोड जब नाम से मेल को बदल सकता है:

[VERSION] = tgt.VERSION + (CASE 
    WHEN tgt.First_Name <> src.First_Name OR tgt.Last_Name <> src.Last_Name 
    THEN 1 
    ELSE 0 END) 
+0

यह रूप में अच्छी तरह काम कर सकता था के लिए NULL मूल्यों की देखभाल करने की जरूरत है, लेकिन @ a1ex07 जवाब है मेरी ज़रूरतों के लिए थोड़ा और अधिक है क्योंकि कुछ भी नहीं बदला गया तो मूल्यों को अपडेट करने की कोई आवश्यकता नहीं है। – TrialAndError

+0

मैं एसक्यूएल वर्जन टेबल्स (अस्थायी) का उपयोग कर रहा हूं और जो अपडेट होने पर एक प्रतिकृति पंक्ति डालता है, तो मैं इस – DJIDave

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