查找哪两列在两行之间有所不同?

时间:2012-01-04 13:53:26

标签: sql sql-server-2008 tsql row

我们正在为每个操作表使用审计表,该表存储其操作等效项的先前值加上更改日期,更改类型(更新或删除)以及自己的自动增量主键。

因此,对于具有UserID,Name,Email列的用户,会有一个表xUsers,其中包含列ID,OpererationType,OperationDate,UserID,Name,Email。

看到xTable包含其“父”用3个额外字段做的每一列。对我们系统使用的所有表重复此模式。

表用户:

UserID           int    
Name             nvarchar
Email            nvarchar

表xUsers:

    xUserID          int    
    OpererationType  int
    OperationDate    datetime
    UserID           int    
    Name             nvarchar
    Email            nvarchar

现在,我的问题: 如果我有一个UserID,当电子邮件被更改两次时,xUsers表中有2个条目,

如何构建一个查询,以确定审计表中两行之间哪些列(可以多于1个)不同?

2 个答案:

答案 0 :(得分:3)

如果我正确理解了这一点,你想创建一个以UserID作为参数传递的查询,我将在下面的例子中将其称为@UserID。

此查询将选择xUsers连接到自身的所有行,其中非UserID列存在差异,使用一系列case语句(每列一个)来明确指出哪些列不同。

SELECT *
    , CASE 
        WHEN a.OperationType <> b.OperationType
        THEN 1
        ELSE 0
        END AS OperationTypeDiffers
    , CASE
        WHEN a.OperationDate <> b.OperationDate
        THEN 1
        ELSE 0
        END AS OperationDateDiffers
FROM xUsers a
JOIN xUsers b
    ON a.xUserID < b.xUserID
    AND a.UserID = b.UserID
    AND (a.OperationType <> b.OperationType
        OR a.OperationDate <> b.OperationDate) -- etc.
WHERE a.UserID = @UserID

答案 1 :(得分:0)

您可以将xUsers行放在临时表中,然后为每个行进行一个while循环并比较结果。

您可以执行一些动态SQL并使用sysobjects和syscolumns表来比较每个结果。它会更加动态,然后很容易为其他表实现。