【问题标题】:How to find out which column value changed in SQL如何找出 SQL 中更改的列值
【发布时间】:2017-12-30 04:33:39
【问题描述】:

我有两个包含 100 列的表,我想了解这两个表中哪个列的值发生了变化。我可以找到哪一行已更改,但我想更改哪一列而不是整行。

Table 1 
          name   ID    Dept   Email       EmpID    Salary  Gender  
          Rob     1     IT     I@i.com     100    5000       M 
          Mary    2     HR     M@m.com     20      6000      F 
          Jack    3     IT     J@j.com     30       7000     M 
          Harry   4     Fin     h@h.com    50       5000     M 
          Jay     5     Eng     Null        60       5000    M  
          Ken     6     HR      K@K.com     70       Null    M  

 Table 2 
          name   ID    Dept   Email       EmpID   Salary  Gender  
          Rob     1     IT     I@i.com     100    5000       M 
          Mary    2     HR     M@m.com     20      6000      F 
          Jack    3     IT     J@j.com     150     7000     M 
          Harry   4     Fin     h@h.com    50       Null    M 
          Jay     5     Eng     Jy@jy.com  60       5000     M  
          Ken     6     HR      K@K.com    70       6000     M  

我们可以看到 Jay 的电子邮件存在,Jack 的 Emp ID 已更改,Harry 的薪水在表 2 中为空,并且为 Ken 添加了薪水。

预期输出(如果可能的话,因为我不想看到所有的行值,我只想看看哪个列值发生了变化,因为 ID 是唯一标识符,我想知道哪个 ID 做了列值变化)

 ID     columnvaluechanged
  3        EmpID 
  4        Salary 
  5        Email 
  6        Salary 

【问题讨论】:

  • 如果多列值改变了怎么办?重复行?
  • 是的,一个 ID 的多个列可能会发生变化,这只是一种情况,因为我只是想找出哪个列值发生了变化,这样我就可以查看那些列但不会有一个 ID 的任意多行,任何行的 ID 都不重复

标签: sql sql-server sql-server-2014


【解决方案1】:

这是使用非透视技术的一种方法

;WITH tab1
     AS (SELECT id,
                colName,
                value
         FROM   Yourtable1
                CROSS apply (VALUES (NAME,'name'),(Dept,'Dept'),(Email,'Email'),
                                    (Cast(EmpID AS VARCHAR(50)),'EmpID'),
                                    (Cast(Salary AS VARCHAR(50)),'Salary'),
                                    (Gender,'Gender')) cs (value, colName)),
     tab2
     AS (SELECT id,
                colName,
                value
         FROM   Yourtable2
                CROSS apply (VALUES (NAME,'name'),(Dept,'Dept'),(Email,'Email'),
                                    (Cast(EmpID AS VARCHAR(50)),'EmpID'),
                                    (Cast(Salary AS VARCHAR(50)),'Salary'),
                                    (Gender,'Gender')) cs (value, colName))
SELECT t1.ID,
       t1.colName,
       t1.value AS tab1_value,
       t2.value AS tab2_value
FROM   tab1 t1
       INNER JOIN tab2 t2
               ON t1.ID = t2.ID
                  AND t1.colName = t2.colName
                  AND Isnull(t1.value, '') <> Isnull(t2.value, '') 

【讨论】:

  • 非常感谢,真的很有帮助
猜你喜欢
  • 2017-08-02
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多