sql - 找出两行中哪一列不同?

标签 sql sql-server-2008 t-sql row

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

因此,对于包含 UserID、Name、Email 列的 Users 表,将会有一个包含 ID、OpererationType、OperationDate、UserID、Name、Email 列的 xUsers 表。

看到 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)存在差异?

最佳答案

如果我理解正确,您会希望创建一个将 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

关于sql - 找出两行中哪一列不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728030/

相关文章:

sql - XML 到 SQL 结果集。多个嵌套级别

sql - MS SQL Server - 使用 Case 语句从 3 条记录创建一行

mysql - NodeJS 应用程序 (Express) 中的 Google Cloud SQL 连接 --> 错误 : connect ENOENT

sql - MSMQ v 数据库表

c# - SQL Server : conversion failed when converting from a character string to uniqueidentifier

sql - 如何选择所有具有以特定数字开头的 bigint 字段的记录?

sql - 如何获取自定义订单的结果?

sql - 消息 102,级别 15,状态 1,第 2 行 ',' 附近的语法不正确

sql-server - 导出有关磁盘、CPU 和内存利用率的 SQL Server 信息

t-sql - 查询sybase ase中的输出文件