2011-07-04 62 views
0

我正在使用C#,ASP.NET,SQL Server 2008 R2。我的代碼非常簡單,但我仍然遇到同樣的錯誤。問題與SELECT TOP 1

我有一個表Bids,其列OfferAmountStatus
Status可以是「活動」或「紅色」。我想計算表中具有Status = 'Active'的行的平均值OfferAmount並將其與預設值進行比較。如果計算出的平均值OfferAmount低於預設值,則將該行的Status設置爲當前的Status = 'Active',並將最低的OfferAmount設置爲「紅色」。然後我重新運行這個過程。我使用一個do/while循環,條件是calculated average > preset value.

除了一個條件,一切都可以正常工作。如果我有兩個OfferAmounts是相等的,我需要設置它們的兩個Status = 'Red'(所以它們不再是我對Status ='Active'計算的一部分)。

在這種情況下,我的循環將一個OfferAmount設置爲Status = 'Red',但它跳過另一個OfferAmount。通過跳過,我的意思是它表現得好像它不存在一樣,然後移動到下一個最高點OfferAmount。所以我留下了一個狀態='有效'的行。它繼續前進,並將其餘的行'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命令,所有的工作除了在此一例。我開始認爲這是一個配置問題。

回答

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

如果TOP n之後添加WITH TIES你可以得到額外的行(導致超過n總)與基於順序列的值BY子句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) 
+0

這也是我的想法+1對查詢的改動也很小, – gbn

0

感謝您的幫助。我沒有最終使用它,因爲在我看到您的回覆之前,我將它分成了兩個單獨的sql命令。第一個使用與之前使用的相同的Select Top 1 Where語句檢索行ID。第二個命令然後將該行ID的狀態設置爲「紅色」。

要麼分解它或我沒有把它作爲一個單一的命令正確地放在一起。

感謝您的想法!