比较两行数据之间的值并仅显示不同的列

Posted

技术标签:

【中文标题】比较两行数据之间的值并仅显示不同的列【英文标题】:Comparing values between two rows of data and only showing the columns that are different 【发布时间】:2011-05-02 00:16:37 【问题描述】:

在以前的应用程序版本中,我们使用特定字段作为主键,但由于该字段可能代表不同系统中的不同身份,我们将其设为非重要字段(即不是主键或复合主键的一部分) 但是,由于我们没有其他系统,但用户仍然使用该字段作为主要的识别方法。

问题在于审计...以前我使用单个表对数据库进行所有审计,使用浮动的通用触发器使用新值旧值模式转储数据。除了一件事,这仍然可以正常工作。我已将联系信息移动到一个单独的表中,该表与原始表的新主键相关联。因此,当进行更改时,审核日志中会显示不熟悉且未使用的主键,而不是现在无关紧要的 foreignSystemID...

我开始采用一对一的复制审核方法,以便对任何表的任何更改现在都写入不同架构中的镜像。问题归结为向用户显示更改。他们习惯于查看仅显示特定医生更改值的报告...

我的问题是使用 sql 查询和 Crystal 报表,我如何才能只显示审计表中行之间的更改列值。我看过枢轴命令,但我认为这对我没有帮助。我还查看了脚本中比较列并确定它们是否不同并将它们写入表的代码。

我真的在沙子里旋转,这是我要解决的关键问题。在此先感谢您的帮助...

我们已经足够早地投入生产,如果需要我可以更改我的变更跟踪方法,但它需要尽快。谢谢

编辑:

我的老板和我已经在这方面做了一些工作,这就是我们的开始......我想获得更多的意见和选择......以及......谢谢......

CREATE TABLE #TEMP (
    DoctorsID bigint, 
    TableName varchar(50), 
    FieldName varchar(50), 
    CurrentFieldValue varchar(255), 
    PreviousFieldValue varchar(255), 
    PreviousValueDate datetime 
    )

DECLARE @sql varchar(MAX)

SELECT 
    @sql = COALESCE(@sql,'') + 
    CAST(
        'INSERT INTO #TEMP ' + 
            'SELECT ' + 
                'o.DoctorsID, ' + 
                '''' + TABLE_NAME + ''' ,' + 
                '''' + COLUMN_NAME + ''',' + 
                'o.' + COLUMN_NAME + ',' +
                'a.' + COLUMN_NAME + ',' +
                'a.AuditDate' +
            ' FROM ' + 
                'dbo.DoctorLicenses o ' + 
                    'INNER JOIN Audit.DoctorLicenses a ON ' + 
                        'o.DoctorsID = a.DoctorsID ' + 
            'WHERE ' + 
                'AuditDate BETWEEN ''10/01/2010'' AND ''10/31/2010'' AND ' + 
                'o.' + COLUMN_NAME + ' <> a.' + COLUMN_NAME + 
            ';'     
    AS varchar(MAX))
FROM 
    INFORMATION_SCHEMA.COLUMNS AS [Fields]      
WHERE 
    TABLE_SCHEMA = 'dbo' AND 
    TABLE_NAME = 'DoctorLicenses' 

PRINT @sql

EXEC(@sql)

SELECT * FROM #TEMP

DROP TABLE #TEMP

【问题讨论】:

【参考方案1】:

在我看来存在设计问题,但我现在很难想象您的设计是什么。您能否更具体地说明您的表格目前的样子以及您尝试根据哪些数据生成报告?

另外,在谈到审核“更改的值”时,您如何跟踪更改的内容?

【讨论】:

对不起,你是对的,我最初的问题似乎总是模棱两可。每个表在单独的模式中都有一个匹配的表。 dbo.contactinfo 有 audit.contactinfo。除了审计有 2 个额外的列(类型、审计日期)之外,所有列都是相同的。更改数据项时,将使用当前数据将新行插入审计表中。因此,您有前一行中的数据(按审计日期排序时)以及当前日期是第一行。因此,如果您正常查询审计表,您将获得对该表所做的所有更改的完整说明。 但是我们的用户希望在列中看到当前值/旧值表示。我和我的老板实际上能够很好地解决这个问题......看看我的编辑......谢谢 好的,我对你想去的地方有了更好的了解。最终结果是什么样的?

以上是关于比较两行数据之间的值并仅显示不同的列的主要内容,如果未能解决你的问题,请参考以下文章

SQL如果为true,则查看不同的列值并对其进行计数

如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?

比较不同时间戳的值并确定它们是不是已更改

连接后,表中的两行在另一个表中显示为两个不同的列

比较数组中的值并删除 Ruby/Rails 中不同的项目

Oracle - 两个表中两行之间的差异或变化