续集 returns 与 MySql 结果不同的值

Sequelize returns different value than MySql result

我发生了一些非常奇怪的事情,似乎没有任何效果。我在 MySql 中有一个 SP,return 有一些结果。当我运行SP在MySqlworkbench一切正确。查询很长。但这是 LEFT JOIN 以某种方式造成了问题。我有其他内部 joins/left 连接,但它们很好。

SELECT DISTINCT Id.ReelTag
        , Id.ECSPartNo
        , WM.ShortDescription AS Description
        , Id.ReelTagSerial
        , group_concat(DISTINCT RA.UniqueID) AS UniqueID
        , group_concat(DISTINCT coalesce(RA.OrdNo, Std.OrdNo)) AS OrdNo
        , Id.Received
        , IFNULL(Std.ReelQuantity,0) AS OriginalQuantity
        , IFNULL(Id.Quantity,0) AS CurrentQuantity
        , IFNULL(yest.Quantity,0) AS YesterdayQuantity
        , IFNULL(cuts.Quantity,0) AS QuantityChanged
        , cuts.OrdNo AS OrdNoChange
        , IFNULL(CC.ShipQuantity,0) AS ShipQuantity
        , CC.OrdNo AS OrdNo_Allocated
        , IFNULL(Id.Quantity,0) - IFNULL(yest.Quantity,0) AS changeAOF_Yesterday
    FROM InventoryDtl Id .....

LEFT JOIN (
        SELECT 
            SourceReel
            , SUM(CASE WHEN Action = 'Insert' THEN TotalQuantity
                    WHEN Action = 'Delete' THEN -TotalQuantity
                    ELSE 0 END) AS Quantity
            , group_concat(DISTINCT CASE WHEN Action = 'Insert' THEN concat(OrdNo,'(Cut)') ELSE concat(OrdNo,'(UnCut)') END) AS OrdNo
        FROM (
            SELECT 
                Action
                , SourceReel
                , OrdNo
                , SUM(Quantity) AS TotalQuantity
            FROM CableCuts_Log CD
            WHERE 1=1
            AND 1 = CASE
                WHEN SourceReel IS NOT NULL AND OrdNo LIKE 'E9%' AND Quantity > 0 AND DaTediff(Now(),LogDate) = 0 THEN 1
                ELSE 0 END
            GROUP BY Action, SourceReel, OrdNo
        ) CC
        WHERE 1=1
        GROUP BY SourceReel
    ) cuts ON Id.ReelTag = cuts.SourceReel

同样,当我在 MySql workbench 中 运行 时,它很好,如果有差异,会在一秒钟内加载。

但是当我使用 API 调用 SP 时...

let inventoryReport = await models.sequelize
    .query(
        `call rpt_DailyInventoryReport($location, $byECSPartNo);`,
        { bind: {location: req.body.location, byECSPartNo: null} },           
    )

for(i=0;i<inventoryReport.length;i++) {
        if(inventoryReport[i].ReelTagSerial == '6906' || inventoryReport[i].ReelTagSerial == '6858') {
            console.log(inventoryReport[i]);
        }
        
    }

并使用 ExcelJS 将其导出到 Excel 中,查询中的 2 个“剪切”列本质上是 NULL,因为“剪切”的 return 值 select 即将出现 NULLS,这就是它给出 IFNULL 值的原因。同样在 MySql workbench.

中工作

这些是 API 抛出的值。

{
            "ReelTagSerial": 6858,
            "CurrentQuantity": 700,
            "YesterdayQuantity": 2500,
            "QuantityChanged": 0,
            "OrdNoChange": null,
            "ShipQuantity": 0,
            "OrdNo_Allocated": null,
            "changeAOF_Yesterday": -1800
        },

{
            "ReelTagSerial": 6906,
            "CurrentQuantity": 2730,
            "YesterdayQuantity": 3330,
            "QuantityChanged": 0,
            "OrdNoChange": null,
            "ShipQuantity": 0,
            "OrdNo_Allocated": null,
            "changeAOF_Yesterday": -600
        },

这是它们的值应该是的 2 行。

{
            "ReelTagSerial": 6906,
            "CurrentQuantity": 2730,
            "YesterdayQuantity": 3330,
            "QuantityChanged": 600,
            "OrdNoChange": E92021(Cut),
            "ShipQuantity": 0,
            "OrdNo_Allocated": null,
            "changeAOF_Yesterday": -600
        }

{
            "ReelTagSerial": 6858,
            "CurrentQuantity": 700,
            "YesterdayQuantity": 2500,
            "QuantityChanged": 1800,
            "OrdNoChange": E912345(Cut),
            "ShipQuantity": 0,
            "OrdNo_Allocated": null,
            "changeAOF_Yesterday": -1800
        },

我尝试创建一个临时文件 table 并为 QuantityChanged 字段定义字段类型 varchar、text、mediumint。 起初我想也许 ExcelJs 不喜欢 key/value 对,但后来我只是控制台记录了 2 行,它们就像 Sequelize 中的那样 returning。我已经尝试使用每种可能的数据类型来转换 2 个字段。

, CAST(cuts.OrdNo AS char) AS OrdNoChange
, CAST(cuts.OrdNo AS binary) AS OrdNoChange

现在我只是立即将 return 结果作为响应发送回 Postman,并查看所有行以确保无论出于何种原因这些值都没有设置在其他行中。不过好像都还不错。

如果我只是重新排列列,使两个错误的字段获得其他字段的值,它们会填充它们的值,所以这就是我所能得到的。或者,如果我只输入 1000 或一个字符串类型 returns 正确,那么它必须与“削减”查询中的这两种数据类型有关。

我已经尝试 returning 简单地 returning 这些来自“削减”连接查询

SELECT 
            DISTINCT SourceReel
            #, CAST(SUM(CASE WHEN Action = 'Insert' THEN TotalQuantity
            #       WHEN Action = 'Delete' THEN -TotalQuantity
            #       ELSE 0 END) AS UnSigned) AS Quantity
            , SUM(TotalQuantity) AS Quantity
            ,  OrdNo
            #, group_concat(DISTINCT CASE WHEN Action = 'Insert' THEN concat(OrdNo,'(Cut)') ELSE concat(OrdNo,'(UnCut)') END) AS OrdNo

没有任何效果。花费数小时进行故障排除和搜索...

需要一些帮助:)

提前致谢。

我可以通过创建一个 table 并在 SP 调用期间插入其中来解决这个问题。然后在 NodeJs 中,我创建了一个 table 的模型,并在调用 SP 后立即用于查找 table 中的所有内容。

let inventoryReport = await models.Rpt_DailyInventory_Temp.findAll();

然后每次调用 SP 时截断 table。