ОБНОВЛЕНИЕ SQL с критериями WHERE и MIN - PullRequest
0 голосов
/ 13 ноября 2018

Я действительно пытался решить эту проблему, и сейчас она отнимает слишком много времени. Мне просто нужно, чтобы продемонстрировать другим студентам другие возможности программы. Мне и им ничего такого комплексного не понадобится

У меня есть запрос, в котором мне нужно обновить таблицу (ставки) на основе поиска поля (design_code) и минимального значения bid_amount

Я дошел до этого

UPDATE Bids a 
INNER JOIN (SELECT DesignCode, MIN(Bid_Amount) AS Bid_Amount 
            FROM Bids 
            WHERE DesignCode = "FT1") AS b 
    ON (a.DesignCode=b.DesignCode AND a.Bid_Amount =b.Bid_Amount) 
SET Bid_Currently_Successful = No 
WHERE a.DesignCode = "FT1" AND a.Bid_Amount =b.Bid_Amount; ');

Это основано на Таблица обновления SQL, где дата = MIN (дата)

Но я получаю ошибку:

Циркулярная ссылка вызвана Bid_Amount в select

Кажется, я знаю, почему, дубликаты имен, но не знаю, что изменить

Я также получаю ошибку:

Ваш запрос не включает указанное выражение 'DesignCode' в качестве значения агрегатной функции.

Если я изменю имя AS Bid_Amount

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Это должно работать в MySQL:

UPDATE Bids b JOIN
       (SELECT b.DesignCode, MIN(Bid_Amount) AS Min_Bid_Amount 
        FROM Bids b
        WHERE b.DesignCode = 'FT1'
        GROUP BY b.DesignCode
       ) d
       ON b.DesignCode = d.DesignCode AND 
          b.Bid_Amount = d.Min_Bid_Amount) 
SET b.Bid_Currently_Successful = 'No' 
WHERE b.DesignCode = 'FT1' ;

Большинство изменений являются косметическими, но все же полезными:

  • Псевдоним для Bid_Currently_Successful.Это хорошая практика при использовании объединений в обновлении.
  • Одиночные кавычки вместо двойных кавычек вокруг строковых констант.
  • Одиночные кавычки вокруг no (если это не столбец в ваших данных).
  • GROUP BY в подзапросе.
0 голосов
/ 15 ноября 2018

Я сделал это!Спасибо за помощь, ребята, это помогло мне разобраться.Возможно, это не очень красиво, но у меня есть другие дела, поэтому мне все равно

ОБНОВЛЕНИЕ Ставки SET Bid_Currently_Successful = Нет ГДЕ (((a.Bidders) = (ВЫБРАТЬ ТОП 1 участников из ставок WHERE Bid_Currently_Successful= Да И DesignCode = 'FT1' ORDER BY Bid_Amount)) И ((a.date_time_of_bid) = (ВЫБЕРИТЕ ТОП 1 date_time_of_bid ОТ ПРЕДЛОЖЕНИЙ, ГДЕ Bid_Currently_Successful = Да И DesignCode = 'FT1' ORDER BY Bid_Amount) * 100 * * 100 * * 100 * * 100 * * 100 * * 100 *) * 100 * * 100 *) * 100 * * 100 * * 100 *) * 100 * * 100 * * 100 *) * 100 * * 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 * * 100 *) 100 *) * 100 *) 100 * * 100 *) 100 *) 100 *) 100 *)));* Все дополнительные скобки любезно предоставлены Access ...

0 голосов
/ 13 ноября 2018

Прежде всего, привет мистер Ли и добро пожаловать в stackoverflow.

Во-вторых, во внутреннем запросе
SELECT DesignCode, MIN(Bid_Amount) AS Bid_Amount FROM Bids WHERE DesignCode = "FT1"

Вы пытаетесь использовать статистическую функцию с другим столбцом. Обычно, чтобы решить эту проблему, вы должны использовать предложение group by со столбцом, которого нет в статистической функции.

НО, это меняет то, что вам нужно, так как это будет возвращать строки как минимальная сумма для каждого DesignCode . Это не то, что вы хотите.

Вам нужен первичный ключ для строки, который имеет наименьшую из всех ставок, так что вы можете обновить таблицу bids вместе с ней.

Ваш внутренний запрос будет выглядеть примерно так:

SELECT TOP 1 DesignCode, Bid_Amount FROM Bids ORDER BY Bid_Amount

Возвращает верхнюю строку, если она упорядочена в порядке возрастания Bid_Amount.

Итак, ваш общий запрос будет выглядеть примерно так:

UPDATE Bids a
SET Bid_Currently_Successful = 'No'
WHERE
    a.Bidders = (
                    SELECT TOP 1 Bidders 
                    FROM Bids 
                    WHERE DesignCode = 'FT1' 
                    ORDER BY Bid_Amount
                )
    AND a.date_time_of_bid = (
                                 SELECT TOP 1 date_time_of_bid 
                                 FROM Bids 
                                 WHERE DesignCode = 'FT1'
                                 ORDER BY Bid_Amount
                             )

Я думаю, это должно работать нормально.
Но я не думаю, что это чистый путь, так что вот еще один способ, которым я бы подошел к этому ...

UPDATE a
SET a.Bid_Currently_Successful = 'No'
FROM 
    Bids a
    INNER JOIN (
                  SELECT TOP 1
                      Bidders, date_time_of_bid
                  FROM
                      Bids
                  WHERE
                      DesignCode LIKE 'FT1'
                  ORDER BY
                      Bid_Amount
    ) b ON b.Bidders = a.Bidders AND b.date_time_of_bid = a.date_time_of_bid

Я думаю, что это намного чище и быстрее. В этом подходе я убедился, что единственная строка, которая соединяется с таблицей Bids, соответствует той, которая соответствует вашим условиям.

Хотя я должен посоветовать, я не проверял этот подход, но он казался забавным и быстрым способом сделать это.


Счастливого обучения .. :)


EDIT1: в случае, если вы используете MySQL, запрос будет:

UPDATE Bids a
SET Bid_Currently_Successful = 'No'
WHERE
    a.Bidders = (
                    SELECT Bidders 
                    FROM Bids 
                    WHERE DesignCode = 'FT1' 
                    ORDER BY Bid_Amount
                    LIMIT 1
                )
    AND a.date_time_of_bid = (
                                 SELECT date_time_of_bid 
                                 FROM Bids 
                                 WHERE DesignCode = 'FT1'
                                 ORDER BY Bid_Amount
                                 LIMIT 1
                             )

и более чистый подход:

UPDATE a
SET a.Bid_Currently_Successful = 'No'
FROM 
    Bids a
    INNER JOIN (
                  SELECT
                      Bidders, date_time_of_bid
                  FROM
                      Bids
                  WHERE
                      DesignCode LIKE 'FT1'
                  ORDER BY
                      Bid_Amount
                  LIMIT 1
    ) b ON b.Bidders = a.Bidders AND b.date_time_of_bid = a.date_time_of_bid


Спасибо P.Salmon за редактирование.


РЕДАКТИРОВАТЬ2: Спасибо за детали таблицы Мистер Ли. Мне очень помогло. А также добавил условие «где», которое я, похоже, пропустил.

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