TSQL - 基于第二个表中两个整数之间的值进行更新。

TSQL - 基于第二个表中两个整数之间的值进行更新。

问题描述:

在使用数百万行进行批量更新时遇到问题。我在下面试图做的例子。尽可能避免病例陈述,因为超过1000个等级。TSQL - 基于第二个表中两个整数之间的值进行更新。

表1:

id, score, rank 
1 4090 null 
2 6400 null 
3 8905 null 
4 2551 null 

表2:

Rank, Score 
1  0 
2  1000 
3  3500 
4  5000 
5  8000 
6  10000 

我试图更新表1显示正确的排名。
EX:得分为6400的ID 2将高于5000但低于8000因此应该排名第4。这可能没有病例陈述吗?

您可以使用cross apply

update t1 
    set rank = t2.rank 
    from table1 t1 cross apply 
     (select top 1 t2.* 
      from table2 t2 
      where t2.score <= t1.score 
      order by t2.score desc 
     ) t2; 

对于数百万行的我会建议下列之一:

  • 执行更新的批次。
  • 使用case声明。
  • 将出一个新的表,截断原始表,并重新加载

更新的“百千万”往往是一个非常昂贵的操作。

+0

这似乎为我工作。我明天会做更多的抽查。我们在这些补丁期间降低环境。感谢您的帮助! – CxFusion3mp

另一种选择是用一个简单的演唱会JOIN铅()

Update Table1 Set Rank=B.Rank 
From Table1 A 
Join (
      Select Rank 
        ,R1=Score 
        ,R2=Lead(Score,1,999999) over (Order By Score) 
      From Table2 
     ) B on A.score >= B.R1 and A.Score < B.R2 

返回

id score rank 
1 4090 3 
2 6400 4 
3 8905 5 
4 2551 2