【问题标题】:How to rewrite MySQL CTE query without using CTE due version error?如何在不使用 CTE 由于版本错误的情况下重写 MySQL CTE 查询?
【发布时间】:2019-11-04 17:19:00
【问题描述】:

我的 CTE 出现错误。我在 Amazon RDS 上托管数据库。我的计算机(本地主机)上有另一个示例数据库主机。 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 服务器版本相对应的手册,以在第 1 行的“Stores AS (SELECT S.StoreName, RTRIM(LTRIM(LEFT(S.StoreName, 4))) 'St' 附近使用正确的语法

再一次,对于在没有 CTE 的情况下重写我的查询的任何帮助将不胜感激。非常感谢你

【问题讨论】:

  • 错误信息与给定的查询不匹配。在发布的代码中,它是WITH StoreSku AS,并且在您提供的错误消息中显示为Stores AS。只是想确认您收到与发布的代码相同的错误。

标签: mysql mysql-workbench common-table-expression


【解决方案1】:

作为一个简单的解决方案:由于两个 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

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2022-10-16
    • 2020-12-25
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多