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

SQL मर्ज या UPDATE/INSERT . का उपयोग करना

UPDATE m SET 
  col2 = t.col2, 
  col3 = t.col3 -- etc. - all columns except Customer_Number
FROM dbo.Master_File AS m
INNER JOIN 
(
  SELECT 
    Customer_Number, rn = ROW_NUMBER() OVER
    (
      PARTITION BY Customer_Number ORDER BY [timestamp_column] DESC
    ), col2, col3, ... etc ...
  FROM dbo.Temp_Table
) AS t
ON m.Customer_Number = t.Customer_Number
WHERE t.rn = 1;

INSERT dbo.Master_File(Customer_Number, col2, col3, ...etc...)
  SELECT Customer_Number, col2, col3, ...etc...
  FROM 
  (
    SELECT 
      Customer_Number, rn = ROW_NUMBER() OVER 
      (
        PARTITION BY Customer_Number ORDER BY [timestamp_column DESC
      ),
      col2, col3, ...etc...
    FROM dbo.Temp_Table AS t 
    WHERE NOT EXISTS 
    (
      SELECT 1 FROM dbo.Master_File AS m
      WHERE m.Customer_Number = t.Customer_Number
    )
  ) AS x WHERE rn = 1;

यह स्रोत तालिका में कई पंक्तियों का ध्यान रखता है जो गंतव्य में पहले से मौजूद नहीं हैं। मैंने कॉलम नामों के बारे में एक धारणा बना ली है जिसे आपको समायोजित करना होगा।

मर्ज करें आकर्षक हो सकता है, हालांकि कुछ कारण हैं जिनसे मैं कतराता हूं:

  1. वाक्यविन्यास कठिन और याद रखने में कठिन है...
  2. आप नहीं जब तक आप जानबूझकर विशिष्ट लॉकिंग संकेत नहीं जोड़ते हैं, तब तक उपरोक्त दृष्टिकोण से अधिक समेकन प्राप्त नहीं होता है ...
  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 संग्रहीत कार्यविधि में गतिशील SQL परिणाम अस्थायी तालिका में होता है

  2. SQL सर्वर डेटाबेस में एक्सेल स्प्रेडशीट कॉलम आयात करें

  3. उस महीने में सप्ताहांत और सार्वजनिक अवकाश के महीने और संख्या का चयन करने के लिए प्रश्न

  4. किसी भी JSON को SQL सर्वर में की-वैल्यू पेयर (EAV फॉर्मेट) की सूची में पढ़ें

  5. डेटाबेस के लिए लेनदेन लॉग भरा हुआ है