根据值从另一个表中选择一个字段中的列名

时间:2013-10-16 15:06:47

标签: sql sql-server sql-server-2005 sql-update columnname

我有两个值匹配的表,我们称之为PersonID。以下是表格:

Table1

ID   |   Field   |   Value
-----|-----------|--------
1    |   Loc1    |   faf  
1    |   Loc1    |   0653
2    |   Loc1    |   5711  
3    |   Loc1    |   9669
4    |   Loc1    |   ado  
4    |   Loc1    |   6843  
5    |   Loc1    |   rfc  
6    |   Loc1    |   cba 


Table2
ID   |   Loc1    |   Loc2
-----|-----------|--------
1    |   faf     |   0653  
2    |           |   5711
3    |           |   9669  
4    |   ado     |   6843  
5    |   rfc     |         
6    |   cba     |         

我不小心为Table1中的Field插入了值Loc1。我需要根据表2中的colomn名称更新它。

如何通过搜索Table2中的Table1.Value列然后获取列名来更新Table1。我需要它最终看起来像这样:

ID   |   Field   |   Value
-----|-----------|--------
1    |   Loc1    |   faf  
1    |   Loc2    |   0653
2    |   Loc2    |   5711  
3    |   Loc2    |   9669
4    |   Loc1    |   ado  
4    |   Loc2    |   6843  
5    |   Loc1    |   rfc  
6    |   Loc1    |   cba 

注意:所有Loc2值都不是数字,所有Loc1值都不是字母。我只是为了简单起见而使用了这些值。

1 个答案:

答案 0 :(得分:0)

可以使用基本CASE来确定Table2中的哪一列包含valueTable1列中引用的值:

UPDATE t1
SET Field = 
CASE 
    WHEN t1.Value = t2.Loc1 THEN 'Loc1' 
    WHEN t1.Value = t2.Loc2 THEN 'Loc2' 
END
FROM Table1 t1
JOIN Table2 t2
    ON t1.ID = t2.ID

我假设这只是您的实际数据/表结构的简化版本,但您可能会考虑的是,如果这两个表应该包含相同的信息,那么您实际上不需要这两个表。

相反,可以从任一表中旋转或取消数据,以便根据需要在其他表的结构中获得结果。