我们对每个操作表使用审计表,该表存储其操作等效项的先前值以及更改日期、更改类型(更新或删除)及其自己的自动增量主键。
因此,对于包含 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/