2011-07-04 7 views
0

私はC#、ASP.NET、SQL Server 2008 R2を使用しています。私のコードはかなりシンプルですが、私は同じエラーに陥っています。SELECT TOP 1に関する問題

OfferAmountStatusの列を持つテーブルBidsがあります。
Statusは、「アクティブ」または「赤」のいずれかです。私はStatus = 'Active'を持っているテーブルの行の平均OfferAmountを計算し、それをプリセット値と比較したいと思います。計算された平均OfferAmountが既定値よりも低い場合、私は現在のStatus = 'Active'の行をOfferAmountとし、その行のStatusを「赤」に設定します。私はその後、プロセスを再実行します。 do/whileループを使用して条件を指定します。calculated average > preset value.

1つの条件を除いてすべてが完全に機能します。私が同等である2つのOfferAmountsを持っていて、私はそれらのStatus = 'Red'の両方を設定する必要があります(Status = 'Active'の計算には含まれません)。

この場合、私のループはOfferAmountStatus = 'Red'に設定しますが、それ以外の場合はOfferAmountをスキップします。スキップすると、あたかもそれが存在しないかのように振る舞い、次の最高のOfferAmountに移動します。だから、ステータス= 'アクティブ'の行が残っています。それは継続して残りの行「赤」を値の上と下にマークしますが、その行に戻ってくることはありません。

これは、私が使用していますコマンドです:

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) 

私はすべてがこの1場合を除いて働いていた別の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 nWITH TIESを追加する場合は、ORDER BY節内の列の値に基づいn行目で結ぶ追加の行(合計以上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

助けてくれてありがとう。あなたの返事を見る前に、私はそれを2つの別々のSQLコマンドに分割していたので、私はそれを使って終わらなかった。最初のものは前に使用したのと同じSelect Top 1 Whereステートメントを使用して行IDを取得しました。 2番目のコマンドは、その行IDのStatusを 'Red'に設定します。

それを解読するか、それを1つのコマンドとして正しくまとめることはできませんでした。

ありがとうございました!

関連する問題