sql >> Databasteknik >  >> RDS >> Sqlserver

Jämför två rader och identifiera kolumner vars värden är olika

Du säger:

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

Detta innebär att du vill att visningen (eller rapporten) ska få de ändrade parametrarna att sticka ut.

Om du ändå ska visa alla parametrar, skulle det vara mycket enklare att göra detta programmatiskt i frontend. Det skulle vara ett mycket enklare problem i ett programmeringsspråk. Eftersom jag inte vet vad ditt användargränssnitt är, kan jag tyvärr inte ge dig några särskilda rekommendationer.

Om du verkligen inte kan göra det i gränssnittet utan måste ta emot denna information i en fråga från databasen (du sa "bara SQL"), måste du ange vilket format du vill ha data i. A en kolumn lista över de kolumner som ändrades mellan de två posterna? En lista över kolumner med en flagga som anger vilka kolumner som ändrades eller inte?

Men här är ett sätt som skulle fungera, även om det under processen konverterar alla dina fält till nvarchars innan det gör sin jämförelse:

  1. Använd tekniken som beskrivs här (friskrivningsklausul:det är min blogg) för att omvandla dina poster till ID-namn-värde-par.
  2. Anslut den resulterande datamängden till sig själv på ID, så att du kan jämföra värdena och skriva ut de som har ändrats:

     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. Formatera ett tal som valuta i MariaDB

  2. isolera en understräng i en sträng före en symbol i SQL Server 2008

  3. UNION resultatet av flera lagrade procedurer

  4. Flera databasanslutning i Rails