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

दो पंक्तियों की तुलना करें और उन स्तंभों की पहचान करें जिनके मान भिन्न हैं

आप कहते हैं:

 We want to highlight the parameters that have changed since the last revision.

इसका मतलब है कि आप चाहते हैं कि डिस्प्ले (या रिपोर्ट) बदले हुए पैरामीटर को अलग बनाए।

यदि आप वैसे भी सभी पैरामीटर दिखाने जा रहे हैं, तो इसे प्रोग्रामेटिक रूप से फ्रंट एंड में करना बहुत आसान होगा। प्रोग्रामिंग भाषा में यह एक बहुत ही सरल समस्या होगी। दुर्भाग्य से, यह नहीं जानते कि आपका फ्रंट एंड क्या है, मैं आपको विशेष सिफारिशें नहीं दे सकता।

यदि आप वास्तव में इसे फ्रंट एंड में नहीं कर सकते हैं, लेकिन डेटाबेस से एक क्वेरी में यह जानकारी प्राप्त करनी है (आपने "केवल-एसक्यूएल" कहा था), तो आपको उस प्रारूप को निर्दिष्ट करने की आवश्यकता है जिसमें आप डेटा चाहते हैं। ए कॉलम की सिंगल-कॉलम सूची जो दो रिकॉर्ड्स के बीच बदल गई है? ध्वज के साथ स्तंभों की सूची यह दर्शाती है कि कौन से स्तंभ बदले या नहीं बदले?

लेकिन यहां एक तरीका है जो काम करेगा, हालांकि इस प्रक्रिया में यह तुलना करने से पहले आपके सभी क्षेत्रों को nvarchars में बदल देता है:

  1. अपने रिकॉर्ड को आईडी-नाम-मूल्य जोड़े में बदलने के लिए यहां वर्णित तकनीक का उपयोग करें (अस्वीकरण:यह मेरा ब्लॉग है)।
  2. परिणामी डेटा सेट को आईडी पर स्वयं में शामिल करें, ताकि आप मानों की तुलना कर सकें और जो बदल गए हैं उन्हें प्रिंट कर सकें:

     with A as (    
    --  We're going to return the product ID, plus an XML version of the     
    --  entire record. 
    select  ID    
     ,   (
          Select  *          
          from    myTable          
          where   ID = pp.ID                            
          for xml auto, type) as X 
    from    myTable pp )
    , B as (    
    --  We're going to run an Xml query against the XML field, and transform it    
    --  into a series of name-value pairs.  But X2 will still be a single XML    
    --  field, associated with this ID.    
    select  Id        
       ,   X.query(         
           'for $f in myTable/@*          
           return         
           <data  name="{ local-name($f) }" value="{ data($f) }" />      
           ') 
           as X2 from A 
    )
    ,    C as (    
     --  We're going to run the Nodes function against the X2 field,  splitting     
     --  our list of "data" elements into individual nodes.  We will then use    
     -- the Value function to extract the name and value.   
     select B.ID as ID  
       ,   norm.data.value('@name', 'nvarchar(max)') as Name  
       ,   norm.data.value('@value', 'nvarchar(max)') as Value
    from B cross apply B.X2.nodes('/myTable') as norm(data))
    
    -- Select our results.
    
    select *
    from ( select * from C where ID = 123) C1
    full outer join ( select * from C where ID = 345) C2
        on C1.Name = c2.Name
    where c1.Value <> c2.Value 
      or  not (c1.Value is null and c2.Value is null)
    


  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 सर्वर में अंतिम-सम्मिलित पहचान मान वापस करने के लिए @@ पहचान का उपयोग करें

  2. बाधा का नाम जाने बिना विदेशी कुंजी छोड़ें?

  3. EXISTS बनाम जॉइन और EXISTS क्लॉज का उपयोग

  4. SQL सर्वर (T-SQL उदाहरण) में 'datetimeoffset' को 'smalldatetime' में बदलें

  5. लिनक्स-आधारित SQL सर्वर इंस्टेंस के बीच हमेशा उपलब्धता समूह को समझना। भाग 1