首页 > 解决方案 > 使用不相关的表将表中的一列中的数据替换为另一列

问题描述

我正在更新一个现有系统,该系统将在网络上显示一个表格,以显示谁已经下班。数据是从由两个表组成的数据库中提取的。一个包含从通话中记录的实际数据,另一个是排序的“图例”,因此将列中的单个数字转换为纯文本描述。例如:

Options Table

|---------------------|------------------|------------------|
|      LevelName      |     OptionNo     |    Description   |
|---------------------|------------------|------------------|
|         LorA        |         1        |       Late       |
|---------------------|------------------|------------------|
|         LorA        |         2        |      Absent      |
|---------------------|------------------|------------------|
|         TorT        |         1        |       Today      |
|---------------------|------------------|------------------|
|         TorT        |         2        |     Tomorrow     |
|---------------------|------------------|------------------|

第二个表有这样的布局(只显示相关字段):

CallData Table

|---------------------|------------------|------------------|
|     EmployeeName    |  Todaytomorrow   |  Late_Or_Absent  |
|---------------------|------------------|------------------|
|         John        |         1        |         1        |
|---------------------|------------------|------------------|
|         Jane        |         2        |         2        |
|---------------------|------------------|------------------|

我遇到的问题是如何以某种方式关联这两个表,以便用选项表中的相应值替换 CallLog 表中的整数表示。

我尝试通过从两个表中选择所有来创建一个临时表,但是当我尝试替换这些值时,只有那些在连接后恰好对齐的值被替换。

这是我目前拥有的 SQL:

/*Create TempTable to be updated*/
 SELECT * INTO #tempStore FROM CallData, [Options]
 WHERE CallData.EmpName IS NOT NULL AND call_completed = '1'

 /*Query Pertinant Info*/
 SELECT [CallinID], [EmpName], [TodayTomorrow] AS [When], [Late_Or_Absent] AS [Type], [Late_Reason] AS [Reason], 
 [Absent_Reason], [Early_Reason], [Contact_Number], [Comment], [created_dt] FROM [#tempStore]

 /*Update Type to varChar*/
 ALTER TABLE [#tempStore]
 ALTER COLUMN [TodayTomorrow] nvarchar(20)

  /*Perform TorT Update*/
 UPDATE [#tempStore] SET [#tempStore].TodayTomorrow = [#tempStore].[Description]
 WHERE [#tempStore].LevelName = 'TorT' AND [#tempStore].TodayTomorrow = CONVERT(nvarchar(1), [#tempStore].[OptionNo])

非常感谢任何和所有帮助。

标签: sqlsql-server

解决方案


对于这个例子,我认为以下方法会起作用:

select  cd.EmployeeName
        ,optTT.Description TodayTomorrow
        ,optLE.Description Late_or_Absent
from    CallData as cd
join    [Options] as optTT on optTT.OptionNo = cd.Late_or_Absent and optTT.LevelName = 'TorT'
join    [Options] as optLE on optLE.OptionNo = cd.TodayTomorrow and optLE.LevelName = 'LorA'

已编辑:添加了不同级别的加入。如果有两个以上的级别,则需要更通用的解决方案。


推荐阅读