我真的已经尝试过这个问题,现在已经花了太多时间。我只需要它就可以向我的学生演示该程序的其他功能。我和他们将不需要任何复杂的东西
我有一个查询,我需要根据查找字段(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 Update Table Where date = MIN(date)
但是我得到了错误:
由select中的Bid_Amount引起的循环引用
我想我知道为什么,重复的名字,但是不知道要更改哪个
我也收到错误消息:
您的查询不包含指定的表达式'DesignCode'作为聚合函数的apt。
如果我确实更改了AS Bid_Amount的名称
答案 0 :(得分:0)
首先,李先生,您好,欢迎来到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:感谢李先生提供的表格详细信息。对我有很大帮助。并添加了我似乎想念的where条件。
答案 1 :(得分:0)
这应该在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
在子查询中。答案 2 :(得分:0)
我做到了!感谢您的帮助,它帮助我弄清楚了。可能不太漂亮,但我还有其他事情要做,所以我不在乎
UPDATE出价SET Bid_Currently_Successful =否 在哪里((((a.Bidders)=(从投标中选择前1个投标人,其中Bid_Currently_Successful =是AND DesignCode ='FT1'ORDER BY Bid_Amount))) AND(((a.date_time_of_bid)= {SELECT TOP 1 date_time_of_bid FROM Bids Bid_Currently_Successful =是AND ANDDesignCode ='FT1'OR BY BY Bid_Amount))));
所有额外的括号都由Access提供...