sql >> Databáze >  >> RDS >> Sqlserver

Porovnejte dva řádky a identifikujte sloupce, jejichž hodnoty se liší

Říkáte:

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

To znamená, že chcete, aby zobrazení (nebo zpráva) umožnilo vyniknout změněným parametrům.

Pokud přesto chcete zobrazit všechny parametry, bylo by mnohem snazší to udělat programově na frontendu. V programovacím jazyce by to byl mnohem jednodušší problém. Bohužel, protože nevím, jaký je váš frontend, nemohu vám dát konkrétní doporučení.

Pokud to opravdu nemůžete udělat v rozhraní frontend, ale musíte tyto informace obdržet v dotazu z databáze (řekli jste „pouze SQL“), musíte určit formát, ve kterém chcete data. A jednosloupcový seznam sloupců, které se mezi těmito dvěma záznamy změnily? Seznam sloupců s příznakem označujícím, které sloupce se změnily nebo nezměnily?

Ale tady je jeden způsob, který by fungoval, ačkoli v tomto procesu převede všechna vaše pole na nvarchars, než provede srovnání:

  1. Použijte techniku ​​popsanou zde (odmítnutí odpovědnosti:to je můj blog) k transformaci svých záznamů na páry ID-název-hodnota.
  2. Připojte výslednou sadu dat k sobě na ID, abyste mohli porovnat hodnoty a vytisknout ty, které se změnily:

     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. Kumulativní součet za sadu řádků v mysql

  2. Jak zkontrolovat velikost databáze a tabulky MySQL

  3. Jak přepsat IS DISTINCT FROM a IS NOT DISTINCT FROM?

  4. 2018 Recenze:7 milníků MariaDB, které jste možná zmeškali