【问题标题】:Selecting the column name into a field from another table based on values根据值将列名选择到另一个表中的字段中
【发布时间】:2013-10-24 18:41:58
【问题描述】:

我有 2 个表将匹配一个值,我们称之为 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 中的字段插入了值 Loc1。我需要根据 Table2 中的列名对其进行更新。

如何通过在 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 值都不是字母。为了简单起见,我只是使用了这些值。

【问题讨论】:

  • 我只是想更新 Table1.Field 以便它具有与 Table2 中相关的正确列名。
  • ID 列不是身份列,它只是个人的 ID。因此,John Smith 的 ID 为 1,Jane Doe 的 ID 为 2,依此类推。
  • Table1.IDTable2.ID 的外键,只需标准化您的数据并删除Table1.FieldTable1.Value。如果Table1 中没有其他数据,也将其删除。如果您不想要标准化数据,请不要使用关系数据库。

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


【解决方案1】:

这可以使用基本的CASE 来确定@​​987654322@ 中的哪一列包含Table1value 列中引用的值:

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

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

相反,可以对任一表中的数据进行透视或反透视,以便根据需要在另一张表的结构中获取结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2017-03-03
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2021-04-17
    • 2020-02-16
    • 2012-01-21
    相关资源
    最近更新 更多