我使用的是C#、ASP.NET、SQL Server2008 R2。我的代码非常简单,但我总是遇到相同的错误。
我有一个包含OfferAmount
和Status
列的表Bids
。
Status
为"Active“或"Red”。我想计算表中具有Status = 'Active'
的行的平均OfferAmount
,并将其与预设值进行比较。如果计算出的平均值OfferAmount
低于预设值,我就会将当前Status = 'Active'
和最低OfferAmount
的行的Status
设置为'Red‘。然后,我重新运行该过程。我使用了一个do/while循环,条件是calculated average > preset value.
除了一个条件之外,一切都运行得很完美。如果我有两个状态相等的OfferAmounts
,并且我需要设置它们的Status = 'Red'
(因此它们不再是我计算状态=‘Active’的一部分)。
在这种情况下,我的循环将一个OfferAmount
设置为Status = 'Red'
,但随后会跳过另一个OfferAmount
。通过跳过,我的意思是它的行为就像它不存在一样,并移动到下一个最高的OfferAmount
。所以我只剩下一行,它的状态= 'Active‘。它继续运行,并将值上方和下方的其余行标记为“Red”,但再也不会返回到该行。
这是我使用的命令:
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命令,除了这一种情况外,所有的命令都有效。我开始认为这是一个配置问题。
发布于 2011-07-04 16:28:54
你可以根据最低出价金额进行比较,即
UPDATE Bids SET
Status = 'Red'
WHERE Status = 'Active' AND
ItemId = @ItemId AND
OfferAmount = (SELECT MIN(OfferAmount)
FROM Bids
WHERE Status = 'Active' AND
ItemId = @ItemId
我还没试过,但这个想法应该行得通。
发布于 2011-07-04 17:20:14
如果在TOP n
之后添加WITH TIES
,则可以根据ORDER BY子句中列的值获得与n
-th行绑定的其他行(导致总行数超过n
):
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)
发布于 2011-07-05 02:34:53
谢谢你的帮助。我最终没有使用它,因为在我看到您的回复之前,我将它拆分为两个单独的sql命令。第一个使用我之前使用过的Select Top 1 Where语句检索行ID。然后,第二个命令将该行ID的状态设置为“Red”。
要么把它拆开就解决了它,要么我没有把它正确地组合成一个命令。
谢谢你的点子!
https://stackoverflow.com/questions/6573879
复制