Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bandingkan dua baris dan identifikasi kolom yang nilainya berbeda

Anda mengatakan:

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

Ini menyiratkan bahwa Anda ingin tampilan (atau laporan) menonjolkan parameter yang diubah.

Jika Anda tetap akan menampilkan semua parameter, akan jauh lebih mudah untuk melakukan ini secara terprogram di front end. Ini akan menjadi masalah yang jauh lebih sederhana dalam bahasa pemrograman. Sayangnya, karena tidak tahu apa front end Anda, saya tidak bisa memberikan rekomendasi khusus.

Jika Anda benar-benar tidak dapat melakukannya di front end tetapi harus menerima informasi ini dalam kueri dari database (Anda memang mengatakan "SQL-only"), Anda perlu menentukan format yang Anda inginkan untuk data tersebut. A daftar kolom tunggal dari kolom yang berubah di antara dua catatan? Daftar kolom dengan bendera yang menunjukkan kolom mana yang berubah atau tidak?

Tapi inilah satu cara yang akan berhasil, meskipun dalam prosesnya ia mengubah semua bidang Anda menjadi nvarchars sebelum melakukan perbandingan:

  1. Gunakan teknik yang dijelaskan di sini (penafian:itulah blog saya) untuk mengubah catatan Anda menjadi pasangan ID-nama-nilai.
  2. Gabungkan kumpulan data yang dihasilkan dengan dirinya sendiri di ID, sehingga Anda dapat membandingkan nilai dan mencetak nilai yang telah berubah:

     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. Dapatkan hari dalam seminggu di SQL Server 2005/2008

  2. Penginstalan dan Konfigurasi SQL Server Log Pengiriman &Pemulihan Bencana -1

  3. Bagaimana cara menghitung total berjalan dalam SQL tanpa menggunakan kursor?

  4. Tulis angka dengan dua tempat desimal SQL Server

  5. Perbaiki "SQL Server memblokir akses ke PERNYATAAN 'OpenRowset/OpenDatasource' dari komponen 'Kueri Terdistribusi Ad Hoc"