sql >> Database teknologi >  >> RDS >> Sqlserver

Sammenlign to rækker og identificer kolonner, hvis værdier er forskellige

Du siger:

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

Dette indebærer, at du ønsker, at displayet (eller rapporten) skal få de ændrede parametre til at skille sig ud.

Hvis du alligevel vil vise alle parametrene, ville det være meget nemmere at gøre dette programmatisk i frontend. Det ville være et meget enklere problem i et programmeringssprog. Da jeg ikke ved, hvad din frontend er, kan jeg desværre ikke give dig særlige anbefalinger.

Hvis du virkelig ikke kan gøre det i frontend, men skal modtage disse oplysninger i en forespørgsel fra databasen (du sagde "kun SQL"), skal du angive det format, du vil have dataene i. A en enkelt kolonne liste over de kolonner, der ændrede sig mellem de to poster? En liste over kolonner med et flag, der angiver, hvilke kolonner der ændrede sig eller ikke?

Men her er en måde, der ville fungere, selvom den i processen konverterer alle dine felter til nvarchars, før den foretager sin sammenligning:

  1. Brug teknikken beskrevet her (fraskrivelse:det er min blog) til at omdanne dine registreringer til ID-navn-værdi-par.
  2. Slut det resulterende datasæt til sig selv på ID, så du kan sammenligne værdierne og udskrive dem, der er ændret:

     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. Sidst udførte forespørgsler for en specifik database

  2. Forhindrer tilstødende/overlappende poster med EXCLUDE i PostgreSQL

  3. SELECT rejser undtagelser i PL/pgSQL-funktionen

  4. Sammenligning af midlertidige tabeller til PostgreSQL og Oracle GTT