Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 《凡人SQL》第4版-更新数据集_Mysql_Sql - Fatal编程技术网

Mysql 《凡人SQL》第4版-更新数据集

Mysql 《凡人SQL》第4版-更新数据集,mysql,sql,Mysql,Sql,我正在阅读这本书,在第15章“更新数据集”中,在“您要解决的问题”一节中,有以下问题: 将配件类别的零售价=1设置为最高价格供应商的批发价加上35% 我对作者为什么给出这个解决方案有点困惑: UPDATE Products SET RetailPrice = ROUND(1.35 * ( SELECT DISTINCT WholesalePrice FROM Product_Vendors

我正在阅读这本书,在第15章“更新数据集”中,在“您要解决的问题”一节中,有以下问题:

将配件类别的零售价=1设置为最高价格供应商的批发价加上35%

我对作者为什么给出这个解决方案有点困惑:

UPDATE Products 
SET 
RetailPrice = ROUND(1.35 * (
                    SELECT DISTINCT WholesalePrice
                    FROM Product_Vendors
                    WHERE Product_Vendors.ProductNumber = 
                          Products.ProductNumber
                        AND WholesalePrice = (
                                SELECT  MAX(WholesalePrice)
                                FROM Product_Vendors
                                WHERE Product_Vendors.ProductNumber = 
                                      Products.ProductNumber)),0)
WHERE RetailPrice < 1.35 * (
                SELECT DISTINCT WholesalePrice
                FROM Product_Vendors
                WHERE Product_Vendors.ProductNumber = Products.ProductNumber
                    AND WholesalePrice = (
                            SELECT MAX(WholesalePrice)
                            FROM Product_Vendors
                            WHERE Product_Vendors.ProductNumber = 
                                  Products.ProductNumber)
                            LIMIT 1)
AND CategoryID = 1;
…而不是:

UPDATE Products 
SET 
RetailPrice = ROUND(1.35 * (SELECT  MAX(WholesalePrice)
                            FROM Product_Vendors
                            WHERE Product_Vendors.ProductNumber = 
                                  Products.ProductNumber),0)
WHERE RetailPrice < 1.35 * (SELECT MAX(WholesalePrice)
                        FROM Product_Vendors
                        WHERE Product_Vendors.ProductNumber = 
                              Products.ProductNumber
                        LIMIT 1)
AND CategoryID = 1;
两者产生相同的结果,MySQL Workbench中受影响的行数相同……那么为什么呢?谢谢各位


很难推测作者为什么选择这种形式。也许他们想强调一下相关子查询。也许他们想避免书中没有介绍的技术。也许这是他们想到的第一件事,但他们从来没有抽出时间来优化它。也许他们在编写SQL时考虑到了某个MySQL版本的功能,但没有100%的把握,我相信过去有一些MySQL版本无法对子查询进行分组

这里还有另一种方法。我更喜欢它的清晰度,它很可能也更有效

UPDATE
    Products
    INNER JOIN (
        SELECT   ProductNumber, MAX(WholesalePrice) * 1.35 as RetailPrice
        FROM     Product_Vendors
        GROUP BY ProductNumber 
    ) Target ON Target.ProductNumber = Products.ProductNumber
SET
    Products.RetailPrice = ROUND(Target.RetailPrice, 0)
WHERE
    Products.CategoryID = 1
    AND Products.RetailPrise < Target.RetailPrice;

剥猫皮的方法很多。如果您想要一种更高效、更简洁的方式,请尝试将其表示为具有内部联接的更新。多亏了托马拉克,See ROUND似乎是多余的。在这一部分中,有3到4个以上的问题与相同类型的解决方案,其中作者似乎使用了更多的代码,而不是必要的。对我这样的新手来说,这完全是一种迷茫。在过去的36小时里,我一直在想为什么:谢谢你们的回答,别紧张。如果你已经了解了发生了什么,并且自己找到了更好的方法,那么你很可能已经超越了作者的想法。享受这种感觉;