Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में एक साधारण मर्ज स्टेटमेंट का उदाहरण

निम्न उदाहरण SQL सर्वर में दो तालिकाओं को मर्ज करने के लिए T-SQL का उपयोग करता है। यह VALUES . का उपयोग करता है स्रोत तालिका के रूप में तालिका मान निर्माता।

मान लीजिए हम इस तरह एक टेबल बनाते हैं:

CREATE TABLE Idiots (
    IdiotId int IDENTITY(1,1) NOT NULL,
    FirstName varchar(50),
    LastName varchar(50)
    );

INSERT INTO Idiots VALUES 
    ('Peter', 'Griffin'), 
    ('Homer', 'Simpson'), 
    ('Ned', 'Flanders');

SELECT * FROM Idiots;

परिणाम:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

और मान लीजिए कि हम एक मर्ज ऑपरेशन करना चाहते हैं। हम नई पंक्तियाँ सम्मिलित करना चाहते हैं, लेकिन यदि कोई पंक्ति पहले से मौजूद मानों के साथ मौजूद है जो हमारे स्रोत से मेल खाते हैं, तो हम इसके बजाय मौजूदा पंक्ति को अपडेट करना चाहते हैं (नई पंक्ति सम्मिलित करने के बजाय)।

हम इसे इस तरह कर सकते हैं:

DECLARE @Changes TABLE(Change VARCHAR(20));

MERGE INTO Idiots AS Target  
USING ( VALUES 
            (3, 'Ned', 'Okily Dokily!'), 
            (4, 'Lloyd','Christmas'), 
            (5, 'Harry', 'Dunne')
        ) AS Source ( IdiotId, FirstName, LastName )  
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
    UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;

SELECT Change, COUNT(*) AS Count  
FROM @Changes  
GROUP BY Change;

परिणाम:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

दो नई पंक्तियां डाली गईं और एक अपडेट की गई।

यहां, हमने टेबल वैल्यू कंस्ट्रक्टर (VALUES .) का उपयोग किया है ) तालिका के लिए नए मान निर्दिष्ट करने के लिए।

इस मामले में हमने IdiotId . की जांच की और FirstName स्तंभ। मूल रूप से, यदि आईडी और प्रथम नाम समान हैं, तो हम एक नया डालने के बजाय मौजूदा पंक्ति को अपडेट करना चाहते हैं।

हमने WHEN MATCHED . का उपयोग किया यह निर्दिष्ट करने के लिए कि क्या होना चाहिए जब हमारे VALUES . से डेटा क्लॉज लक्ष्य तालिका में डेटा से मेल खाता है। इस मामले में, हम बस VALUES . के नए डेटा के साथ पंक्ति को अपडेट करते हैं ।

हमने WHEN NOT MATCHED BY TARGET . का इस्तेमाल किया यह निर्दिष्ट करने के लिए कि जब कोई मेल नहीं है तो क्या होना चाहिए। इस मामले में हम नए डेटा के साथ एक नई पंक्ति सम्मिलित करते हैं।

हमने @Changes . नामक एक वेरिएबल का भी उपयोग किया है हमारे मर्ज ऑपरेशन के आउटपुट को देखने के लिए। हमने OUTPUT . का इस्तेमाल किया इसके लिए मर्ज ऑपरेशन के बाद क्लॉज। यही हमें ऊपर दी गई परिणामी तालिका देता है।

मर्ज ऑपरेशन का उस पर पड़ने वाले प्रभाव को देखने के लिए अब हम लक्ष्य तालिका की जांच कर सकते हैं:

SELECT * FROM Idiots;

परिणाम:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+

हम देख सकते हैं कि इडियट नंबर 3 (नेड) ने अपना अंतिम नाम अपडेट किया है। हम यह भी देख सकते हैं कि टेबल में दो नए इडियट्स (लॉयड और हैरी) जुड़ गए हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर डेटाबेस मेल (T-SQL) से भेजे गए ईमेल की सूची लौटाएं

  2. इंडेक्स में कॉलम का क्रम कितना महत्वपूर्ण है?

  3. SQL सर्वर संग्रहीत कार्यविधि से API को कॉल करना

  4. पहली बार इसे देखने वालों के लिए MS SQL सर्वर का विश्लेषण

  5. SQL सर्वर DATETIME प्रकार एक सेकंड के 1/300 के टिक में समय क्यों बचाता है?