2017-07-05 48 views
1

在使用數百萬行進行批量更新時遇到問題。我在下面試圖做的例子。儘可能避免病例陳述,因爲超過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。這可能沒有病例陳述嗎?

回答

0

您可以使用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

0

另一種選擇是用一個簡單的演唱會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 
相關問題