具有WHERE和MIN标准的SQL UPDATE

时间:2018-11-13 06:50:22

标签: mysql sql sql-update

我真的已经尝试过这个问题,现在已经花了太多时间。我只需要它就可以向我的学生演示该程序的其他功能。我和他们将不需要任何复杂的东西

我有一个查询,我需要根据查找字段(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的名称

3 个答案:

答案 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提供...