MS SQL - 如何更新局部变量并在WHERE条件中具有变量?

时间:2017-04-03 08:18:42

标签: sql sql-server

目前我尝试使用UPDATE语句更新本地变量,同时还尝试在变量达到某个值时取消UPDATE语句:

UPDATE table
SET @var = @var + 1,
    field = @var
WHERE @var < 10

遗憾的是,这不起作用,因为它运行所有记录而不是10个。有没有人知道如何在不使用循环的情况下优雅地解决这个问题? 谢谢!

编辑: 我试图做的就是为派对分配某种投票。说派对获得总票数的36.47%。所以我计算了这个派对的比率为.47%(整数部分的削减)。现在我按比例DESC订购我的结果表,只要剩下投票,就给每一方加一票。剩余的投票存储在变量中。这过于简单,但我希望你能得到我想做的事。

1 个答案:

答案 0 :(得分:4)

您可以使用ROW_NUMBER()来实现您尝试做的事情。这是一个基本的例子:

declare @t table (field int not null, Ord int not null)
insert into @t(field,Ord) values (0,1),(0,2),(0,3),(0,4),(0,5)

;With Numbered as (
    select
        *,
        ROW_NUMBER() OVER (ORDER BY Ord) as rn
    from
        @t
)
update Numbered
set field = rn
where rn < 4

select * from @t

结果:

field       Ord
----------- -----------
1           1
2           2
3           3
0           4
0           5

这里,行号是在CTE内生成的,并使用适当的列来明确定义排序(因为您的编辑建议您有类似的可用内容)。我们还可以利用您可以针对CTE而不是基表编写UPDATE(前提是UPDATE显然只尝试更新单个表)