【问题标题】:MS SQL - How to update local variable and have variable in WHERE condition?MS SQL - 如何更新局部变量并在 WHERE 条件下有变量?
【发布时间】:2017-08-28 00:42:55
【问题描述】:

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

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

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

编辑: 我正在尝试做的是将某种选票分配给政党。假设一个政党获得了总票数的 36.47%。所以我为这个派对计算了 0.47% 的比率(整数部分的切割)。现在,我按比率 DESC 对我的结果表进行排序,只要还有票数,就为每一方添加一票。剩余的投票存储在变量中。这过于简化了,但我希望你能得到我想要做的。

【问题讨论】:

  • 实际上你想做什么?示例表数据和更新后的所需输出将有助于快速解决问题
  • 您需要将其编写为 WHILE 循环。 stackoverflow.com/questions/753947/…
  • 在您的更新代码中,您正在更新整个表格。?这是你想要做的吗?
  • SQL 适用于集合。 UPDATE 操作“好像”并行计算所有列值并且并行更新所有行。正如 Shakeer 所说,清楚地了解您正在尝试做什么会有所帮助。

标签: sql sql-server


【解决方案1】:

您可能可以通过使用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 显然只尝试更新单个表)

【讨论】:

  • 你能解释一下你为什么要创建一个表吗? op 是否也必须创建一个表,还是您仅出于演示目的而创建它?
  • @gromit190 - 我试着给出完整的例子,而不是让人们猜测我有什么数据。如果 OP 在问题中提供了一些示例数据(理想情况下也是 create table 和 insert 以帮助潜在的回答者),我会复制他们的而不是完全弥补。
  • 好的,谢谢。对于解决 OP 问题是否需要使用表“t”,我有点困惑。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
相关资源
最近更新 更多