Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

So sánh hai hàng và xác định các cột có giá trị khác nhau

Bạn nói:

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

Điều này ngụ ý rằng bạn muốn hiển thị (hoặc báo cáo) làm cho các thông số đã thay đổi trở nên nổi bật.

Nếu bạn vẫn hiển thị tất cả các tham số, sẽ dễ dàng hơn rất nhiều để thực hiện điều này theo chương trình trong giao diện người dùng. Nó sẽ là một vấn đề đơn giản hơn nhiều trong một ngôn ngữ lập trình. Rất tiếc, không biết giao diện người dùng của bạn là gì, tôi không thể đưa ra đề xuất cụ thể cho bạn.

Nếu bạn thực sự không thể làm điều đó trong giao diện người dùng nhưng phải nhận thông tin này trong một truy vấn từ cơ sở dữ liệu (bạn đã nói "Chỉ SQL"), bạn cần chỉ định định dạng bạn muốn dữ liệu. A danh sách một cột của các cột đã thay đổi giữa hai bản ghi? Danh sách các cột có cờ cho biết cột nào đã thay đổi hoặc không thay đổi?

Nhưng đây là một cách sẽ hoạt động, mặc dù trong quá trình này, nó chuyển đổi tất cả các trường của bạn thành nvarchars trước khi thực hiện so sánh:

  1. Sử dụng kỹ thuật được mô tả ở đây (tuyên bố từ chối trách nhiệm:đó là blog của tôi) để chuyển đổi các bản ghi của bạn thành các cặp ID-tên-giá trị.
  2. Nối tập dữ liệu kết quả với chính nó trên ID, để bạn có thể so sánh các giá trị và in các giá trị đã thay đổi:

     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. Liệt kê tất cả các khóa ngoại trên một bảng trong SQL Server

  2. Sử dụng PARSENAME () để trả về một phần của tên đối tượng trong SQL Server

  3. UPSERT nguyên tử trong SQL Server 2005

  4. Hiểu hàm PIVOT trong T-SQL

  5. Làm cách nào để lấy danh sách các bảng trong thủ tục được lưu trữ?