Прежде всего, привет мистер Ли и добро пожаловать в 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: Спасибо за детали таблицы Мистер Ли. Мне очень помогло. А также добавил условие «где», которое я, похоже, пропустил.