使用不相关的表将表中一列中的数据替换为另一列中的数据

时间:2018-06-20 15:53:55

标签: sql sql-server

我正在更新现有的系统,该系统将在Web上显示一个表格,以显示谁下班了。数据是从包含两个表的数据库中提取的。一个包含从呼叫中记录的实际数据,另一个包含“传奇”排序,因此将列中的单个数字转换为纯文本描述。例如:

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])

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对于此示例,我认为以下方法将起作用:

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'

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