sql更新

hpxqektj  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(349)

我真的试过解决这个问题,现在花了我太多的时间。我只需要它来向我的学生演示程序的其他功能。我和他们不需要这么复杂的东西
我有一个查询,我需要更新一个表(投标)的基础上找到一个字段(设计代码)和投标金额的最小值
我已经走到这一步了

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更新表,其中date=min(date)
但我得到了一个错误:
select中投标金额引起的循环引用
我想我知道为什么,重复的名字,但不知道该换哪一个
我还得到一个错误:
您的查询不包括指定的表达式“designcode”作为聚合函数的aprt。
如果我改变了出价金额的名称

toe95027

toe950271#

我做到了!谢谢你们的帮助,这帮了我的忙。可能不漂亮,但我还有别的事要做,所以我不在乎
更新bids a set bid\u currently\u successful=no where((a.bidders)=(从bids\u currently\u successful=yes和designcode='ft1'按投标金额排序的投标中选择前1名投标者)和((a.date\u time\u of \u bid)=(从bids\u currently\u successful=yes和designcode='ft1'按投标金额排序的投标中选择前1名日期\u time\u));
所有额外的支架都有权进入。。。

tkqqtvp1

tkqqtvp12#

这应该可以在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 在子查询中。

zlhcx6iw

zlhcx6iw3#

首先,你好,李先生,欢迎来到stackoverflow。
其次,在内部查询中 SELECT DesignCode, MIN(Bid_Amount) AS Bid_Amount FROM Bids WHERE DesignCode = "FT1" 您正在尝试对另一列使用聚合函数。通常,要解决这个问题,必须使用 group by 包含不在聚合函数中的列的子句。
但是,这会改变您需要的内容,因为这将返回行作为每个设计代码的最小值。那不是你想要的。
您需要的是该行的主键,该行的出价金额是所有出价金额中最低的,因此可以更新该表 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 这张table适合你的情况。
虽然,我应该建议,我还没有检查这个方法,但它似乎是一个有趣的和更快的方式来做这件事。
快乐教学……)
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的编辑。
edit2:谢谢你的餐桌细节,李先生。帮了我很多。还添加了where条件,我似乎错过了。

相关问题