我们正在为每个操作表使用审计表,该表存储其操作等效项的先前值加上更改日期,更改类型(更新或删除)以及自己的自动增量主键。
因此,对于具有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个)不同?
答案 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表来比较每个结果。它会更加动态,然后很容易为其他表实现。