SELECT TOP 1的问题

时间:2011-07-04 16:18:52

标签: c# sql sql-server tsql sql-server-2008-r2

我正在使用C#,ASP.NET,SQL Server 2008 R2。我的代码非常简单,但我仍然遇到同样的错误。

我的表Bids包含OfferAmountStatusStatus是“有效”或“红色”。我想计算表中具有OfferAmount的行的平均Status = 'Active',并将其与预设值进行比较。如果计算出的平均值OfferAmount低于预设值,则我会将行的Status设置为当前Status = 'Active'并将最低OfferAmount设置为“红色”。然后我重新运行这个过程。我使用do / while循环,条件是calculated average > preset value.

除了一个条件外,一切都很完美。如果我有两个OfferAmounts相等且我需要同时设置Status = 'Red'(因此它们不再是我对Status ='Active'的计算的一部分)。

在这种情况下,我的循环会将OfferAmount设置为Status = 'Red',但会跳过另一个OfferAmount。通过跳过,我的意思是它表现得好像它不存在并且移动到下一个最高OfferAmount。所以我留下了一个Status ='Active'的行。它继续前进,并在值的上方和下方标记其余行“红色”,但永远不会返回到该行。

这是我正在使用的命令:

UPDATE Bids 
   SET Status = 'Red' 
 WHERE BidId IN (SELECT TOP 1 BidId 
                   FROM Bids 
                  WHERE Status = 'Active' 
                    AND ItemId = @ItemId 
               ORDER BY OfferAmount, BidDateAndTime DESC)

我尝试了一堆不同的sql命令,除了这一个案例外,所有这些命令都有效。我开始认为这是一个配置问题。

3 个答案:

答案 0 :(得分:3)

您可以对最低出价金额进行比较,即

UPDATE Bids SET 
  Status = 'Red' 
WHERE Status = 'Active' AND 
      ItemId = @ItemId AND  
      OfferAmount = (SELECT MIN(OfferAmount) 
                     FROM Bids 
                     WHERE Status = 'Active' AND 
                           ItemId = @ItemId

我没试过,但这个想法应该有用。

答案 1 :(得分:1)

如果您在TOP n之后添加WITH TIES,则可以获得额外的行(总计超过n)与n行基于ORDER BY子句中列的值:

UPDATE Bids 
SET Status = 'Red' 
WHERE BidId in 
      (SELECT TOP 1 WITH TIES BidId 
       FROM Bids 
       WHERE Status = 'Active' 
         AND ItemId = @ItemId 
       ORDER BY OfferAmount)

答案 2 :(得分:0)

感谢您的帮助。我没有最终使用它,因为在我看到你的回复之前,我把它分成两个单独的sql命令。第一个使用之前使用的相同的Top Top 1 Where语句检索行ID。然后,第二个命令将该行ID的状态设置为“红色”。

要么打破它修复它,要么我没有把它作为一个单独的命令放在一起。

感谢您的想法!