SQL для Mere Mortals 4-е издание - Обновление наборов данных - PullRequest
0 голосов
/ 03 июня 2018

Я просматриваю книгу и в Глава 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 ... так почему тогда?Спасибо, ребята.

Заказы на продажу Изменить схему

1 Ответ

0 голосов
/ 03 июня 2018

Трудно предположить, почему автор выбрал эту форму.Возможно, они хотели сделать вывод о коррелированных подзапросах.Возможно они хотели избежать методов, которые не были представлены в книге.Может быть, это первое, что пришло им в голову, и они так и не смогли оптимизировать его.Возможно, они написали 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...