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
声明。 - 将出一个新的表,截断原始表,并重新加载
更新的“百千万”往往是一个非常昂贵的操作。
答
另一种选择是用一个简单的演唱会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
这似乎为我工作。我明天会做更多的抽查。我们在这些补丁期间降低环境。感谢您的帮助! – CxFusion3mp