我正在使用C#,ASP.NET,SQL Server 2008 R2。我的代码非常简单,但我仍然遇到同样的错误。
我的表Bids
包含OfferAmount
和Status
列
Status
是“有效”或“红色”。我想计算表中具有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命令,除了这一个案例外,所有这些命令都有效。我开始认为这是一个配置问题。
答案 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的状态设置为“红色”。
要么打破它修复它,要么我没有把它作为一个单独的命令放在一起。
感谢您的想法!