SQL Server 2008:更新增量逻辑难度

时间:2013-04-16 09:15:40

标签: c# sql sql-server-2008

使用SQL Server 2008,Visual Studio 2012 C#.NET4.5,win-forms

我有一个包含20个记录的数据网格,他们的一个字段调用“NewPareto”这个字段包含1-20作为整数,基本上是一个联盟得分。请注意,此字段必须允许空值。

如果网格中的用户将位置9更改为位置3,我需要一个查询,在更新后的位置后求助记录,基本上我只想增加1。

然而,我发现这不起作用,因为总是有9个曾经存在的差距,如果我说任何大于3的东西,那么已经存在3个。

我正在考虑将原来的3改为4然后再说增量> 4.但是这仍然没有理清9,除此之外,当将低数字交换为高时似乎逻辑不起作用。

我已经尝试了一些查询,即最新版本也不起作用。

ALTER PROCEDURE [dbo].[IncrimentPareto]
    @pg varchar(255),
    @Pareto int,
    @paretostatic int
AS
   ;With cte as
   (select top 1000000 * 
    from ParetoMain 
    where PG = @pg and 
          NewPareto > @paretostatic and 
          NewPareto is not null
    order by Sales desc )
   UPDATE cte 
   SET @Pareto = NewPareto = @Pareto +1 

这几乎可行,但现在仍然存在两个3,它只能在位置8之后工作,因为9不存在。

希望你的脑袋不会像我一样疲惫不堪。

摘要:在某个位置向上或向下移动联盟之后,用新联盟数字对记录进行排序的查询

2 个答案:

答案 0 :(得分:1)

您可以使用单个更新语句来执行此操作,该语句仅使用row_number函数更新pareto更改的行,并进行一些明智的子查询:

DECLARE @from int = 9, @to int = 3

UPDATE MainPareto 
SET pareto = m.new_pareto
FROM (
    SELECT pKey, -- this is your primary key for the table
    new_pareto = row_number() 
    over(ORDER BY   CASE WHEN pareto = @from THEN @to ELSE pareto END, 
                    CASE WHEN pareto = @from THEN 0 ELSE 1 END)
    FROM MainPareto
    -- put in any conditions that you want to restrict the scores by.
    WHERE PG = @pg AND pareto IS NOT NULL
    -- end condtions
) as m
INNER JOIN MainPareto ON MainPareto.pKey = m.pKey
WHERE MainPareto.pareto <> m.new_pareto

新的帕累托的“row_number()over order”的order by子句,优先于新条目。如果您希望旧版本保持其领先优势,请交换第二个order by子句中的0和1。

答案 1 :(得分:1)

此外,您可以使用选项与CTE和ROW_NUMBER()排名功能

DECLARE @Pareto int = 2,
        @NewPareto int = 5
;WITH cte AS
 ( 
  SELECT ID, ROW_NUMBER() OVER (ORDER BY CASE WHEN Pareto = @Pareto THEN @NewPareto ELSE Pareto END) AS Pareto, Col1
  FROM dbo.test87
  WHERE Pareto != @Pareto
  ),cte2 AS
 (
  SELECT ID, Pareto, @NewPareto AS NewPareto, Col1
  FROM dbo.test87
  WHERE Pareto = @Pareto  
  UNION ALL
  SELECT ID, Pareto, CASE WHEN Pareto >= @NewPareto THEN Pareto + 1 ELSE Pareto END, Col1
  FROM cte
  )
  UPDATE t
  SET t.Pareto = c.NewPareto
  FROM dbo.test87 t JOIN cte2 c ON t.ID = c.ID

SQLFIddle上的演示