Проблема с SELECT TOP 1 - PullRequest
       7

Проблема с SELECT TOP 1

0 голосов
/ 04 июля 2011

Я использую 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. Поэтому у меня осталась строка, у которой есть статус = «Активен». Он продолжает идти и помечает остальные строки как «Красные» выше и ниже значения, но никогда не возвращается к этой строке.

Я использую эту команду:

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 ]

3 голосов
/ 04 июля 2011

Вы можете сравнить минимальную ставку, т. Е.

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 голос
/ 04 июля 2011

Если вы добавите WITH TIES после TOP n, вы можете получить дополнительные строки (в общей сложности более 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)
0 голосов
/ 05 июля 2011

спасибо за помощь. Я не стал использовать его, потому что прежде чем я увидел ваш ответ, я разделил его на две отдельные команды sql. 1-й получал идентификатор строки, используя тот же оператор Select Top 1 Where, который я использовал ранее. Затем вторая команда устанавливает статус этого идентификатора строки на «Красный».

Либо его разбили, либо исправили, либо я неправильно собрал их в одну команду.

Спасибо за идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...