Как переписать MySQL CTE-запрос без использования CTE из-за ошибки версии? - PullRequest
1 голос
/ 04 ноября 2019

Я получаю ошибку с моим CTE. Я размещаю базу данных Amazon RDS. У меня есть другой пример базы данных на моем компьютере (localhost). CTE отлично работает с моим локальным компьютером. Я думаю, что-то не так с Amazon RDS. Может быть, это не поддерживает CTE. Кто-нибудь испытывает ту же проблему? Любая идея, как это исправить или Как я могу переписать этот запрос без CTE? Любая помощь в этом будет высоко оценена.

    WITH StoreSku AS
(
    SELECT 
        S.StoreName
        ,  RTRIM(LTRIM(LEFT(S.StoreName, 4))) 'StoreNumber'
        , P.Sku
        , P.Description
    FROM simplymac_staging.LocationMasterList S
    CROSS JOIN simplymac_staging.`dbo.Sku` P
    WHERE S.Disabled = 0
),
Inventory AS
(
    SELECT 
        I.StoreName
        , RTRIM(LTRIM(LEFT(I.StoreName, 4))) 'StoreNumber'
        , I. ProductName
        , I.ProductIdentifier
        , I.UnitCost
        , SUM(I.Quantity) 'Quantity'
        , I.BinStatus
    FROM simplymac_staging.inventorylistinstores I
    GROUP BY 
          I.ProductIdentifier
        , I.ProductName
        , I.BinStatus
        , I.StoreName
        , I.UnitCost
)
SELECT 
      P.StoreName
    , P.Description
    , P.Sku
    , CASE WHEN I.BinStatus in ('String_InStock') THEN I.Quantity ELSE 0 END ' In Stock'
    , CASE WHEN I.BinStatus in ('String_TransferIn') THEN I.Quantity ELSE 0 END 'TransferIn'
    , CASE WHEN I.BinStatus in ('String_TransferOut') THEN I.Quantity ELSE 0 END 'TransferOut'
    , CASE WHEN I.BinStatus in ('String_OnOrder') THEN I.Quantity ELSE 0 END 'OnOrder'
FROM StoreSku P
LEFT JOIN  Inventory I ON I.ProductIdentifier = P.ID AND I.StoreNumber = P.StoreNumber

ОШИБКА

Код ошибки: 1064. У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с 'Stores AS (SELECT S.StoreName, RTRIM (LTRIM (LEFT (S.StoreName, 4)))' St 'в строке 1

Опять же, любая помощь в переписывании моего запроса без CTE будет очень благодарна. Большое спасибо

1 Ответ

1 голос
/ 04 ноября 2019

Как простое решение: поскольку оба CTE, очевидно, не связаны друг с другом, рекурсия не задействована, и каждый CTE выбирается из основного запроса только один раз, тогда вы можете просто превратить их во встроенные таблицы, т.е. переместить ихк предложению FROM, например:

SELECT 
      P.StoreName
    , P.Description
    , P.Sku
    , CASE WHEN I.BinStatus in ('String_InStock') THEN I.Quantity ELSE 0 END ' In Stock'
    , CASE WHEN I.BinStatus in ('String_TransferIn') THEN I.Quantity ELSE 0 END 'TransferIn'
    , CASE WHEN I.BinStatus in ('String_TransferOut') THEN I.Quantity ELSE 0 END 'TransferOut'
    , CASE WHEN I.BinStatus in ('String_OnOrder') THEN I.Quantity ELSE 0 END 'OnOrder'
FROM 
(
    SELECT 
        S.StoreName
        ,  RTRIM(LTRIM(LEFT(S.StoreName, 4))) 'StoreNumber'
        , P.Sku
        , P.Description
    FROM simplymac_staging.LocationMasterList S
    CROSS JOIN simplymac_staging.`dbo.Sku` P
    WHERE S.Disabled = 0
) P
LEFT JOIN (
(
    SELECT 
        I.StoreName
        , RTRIM(LTRIM(LEFT(I.StoreName, 4))) 'StoreNumber'
        , I. ProductName
        , I.ProductIdentifier
        , I.UnitCost
        , SUM(I.Quantity) 'Quantity'
        , I.BinStatus
    FROM simplymac_staging.inventorylistinstores I
    GROUP BY 
          I.ProductIdentifier
        , I.ProductName
        , I.BinStatus
        , I.StoreName
        , I.UnitCost
) I ON I.ProductIdentifier = P.ID AND I.StoreNumber = P.StoreNumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...