根据同一个表中其他列的不同值更新sql表中的列

时间:2013-03-11 06:55:25

标签: sql sql-server tsql

我有一个包含以下示例数据的SQL表:

Id Test_Id Strategy_Name Symbol_Name Test_Start_Date Test_End_Date Test_Interval P1 P2 P3

11 0       5x5           ICC         2012-01-01      2012-12-31    Hourly    69 18 2    
12 0       5x5           ICC         2012-01-01      2012-12-31    Hourly    5  25 2    
13 0       5x5           ICC         2012-01-01      2012-12-31    Hourly    6  25 2    
14 0       5x5           ICC         2012-01-01      2012-12-31    Hourly    2  25 2    
15 0       5x5           ICC         2011-01-01      2011-12-31    Hourly    2  25 2    

我想运行更新查询,该查询将根据distinct strategy_name,symbol_name,test_interval,P1,P2,P3为test_id列分配唯一值。 因此,除了第4行和第5行之外,上面所有行的test_id都是唯一的,因为除了test_start_date和test_end_date之外,它们具有相同的值,因此它们将具有相同的test_id。

如何执行此操作,您是否可以运行更新查询或存储过程来自动增加测试ID值?

1 个答案:

答案 0 :(得分:0)

我曾经使用ROW_NUMBER()创建ID。我不知道这是否是填写案例中最简单的ID的方法,但它应该有用。

它可以在没有临时表的情况下使用单个更新,但有时我发现以较小的步骤拆分操作更容易。

使用ids

创建临时表
select
    ROW_NUMBER() OVER (order by strategy_name, symbol_name, test_interval, P1, P2, P3 asc) as id,
    strategy_name, symbol_name, test_interval, P1, P2, P3
INTO #ids
FROM [table]
GROUP BY strategy_name, symbol_name, test_interval, P1, P2, P3

填写ids

UPDATE [table]
SET test_id = (select id from #ids where 
  [table].strategy_name = #ids.strategy_name, 
  and [table].symbol_name = #ids.symbol_name, 
  and [table].test_interval = #ids.test_interval, 
  and [table].P1 = #ids.P1, 
  and [table].P2 = #ids.P2, 
  and [table].P3 = #ids.P3)