如何在SQL的变量列中使用ID连接/替换ID?

时间:2019-01-30 00:15:44

标签: sql sql-server windows

我们目前有一个更改日志,该日志记录Windows数据库中表中的所有更改。该表中最重要的两个列是OldValue和NewValue列。当用户将TalentCategoryID从一个TalentCategoryID更改为另一个时,它会显示ID#的更改。我不希望显示TalentCategoryID,而是希望看到与TalentCategoryID关联的名称,该名称在单独的表TalentCategories中具有名称/ id关系。

我遇到的问题是我不能简单地进行联接,因为TalentCategoryID位于OldValue和NewValue列中,而它们并不是严格的TalentCategoryID,因为它是多个表,列和值的变更日志。

是否可以将OldValue和NewValue显示为TalentCategoryID的名称而不是ID本身?

这是我到目前为止的查询:

SELECT T.FirstName, T.LastName, A.TableName, A.ColumnName, A.OldValue, A.NewValue, TC.Name, A.UpdateDate
    FROM [AuditLog] A 
    JOIN Talents T ON A.ModifiedPrimaryKey = T.TalentID
    JOIN TalentCategories TC ON TC.TalentCategoryID = T.TalentCategoryID
    WHERE TableName = 'Talents'
    AND ColumnName = 'TalentCategoryID'

更新1/31/19下面

这是我通过查询拉下表AuditLog的结果

SELECT TOP 1000 * FROM dbo.AuditLog WHERE ColumnName = 'TalentCategoryID'

enter image description here

我试图将OldValue / NewValue列从ID号更改为另一个名为TalentCategories的表中给出的实际Name值,该表具有一个ID列和一个Name列。目的是能够轻松识别TalentCategory从一个类别NAME更改为另一个类别NAME的时间,而无需查看TalentCategories表就可以看到ID号的变化,而我不知道它们的含义。以下是我要实现的目标的示例...

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您只需要left join TalentCategories到旧值和新值上,请小心处理null情况。类似于以下内容:

select
  T.FirstName, T.LastName, A.TableName, A.ColumnName, A.OldValue, A.NewValue
  , coalesce(TC1.[Name], 'Not Set') [Old Category Name]
  , coalesce(TC2.[Name], 'Not Set') [New Category Name]
  , A.UpdateDate
from [AuditLog] A 
inner join Talents T ON A.ModifiedPrimaryKey = T.TalentID
left join TalentCategories TC1 on TC1.TalentCategoryID = A.OldValue
left join TalentCategories TC2 on TC2.TalentCategoryID = A.NewValue
where TableName = 'Talents' and ColumnName = 'TalentCategoryID'