SQL查询实现获取当日每件物品最后扫描ID的问题求助
问题诊断
你当前SQL的核心错误是IN运算符要求两侧字段数量完全匹配,你在heading.JobKeyID IN (子查询)的子查询中返回了tracking.ItemKeyID、MAX(StageID)两个字段,和左侧单个JobKeyID字段不匹配,直接运行会触发字段数量不匹配的报错。
修正方案
方案1:调整子查询逻辑适配IN语法
如果仅需要用子查询过滤符合条件的JobKeyID,只需要保留子查询返回的匹配字段即可:
SELECT jobnumber, ProductName, ItemNumber FROM Product INNER JOIN heading ON Product.jobkeyid = heading.jobkeyid WHERE DateDelivery = CAST(GETDATE() AS date) AND heading.JobKeyID IN ( SELECT DISTINCT Tracking.JobKeyID -- 仅返回需要匹配的单个字段 FROM Tracking INNER JOIN Production ON Tracking.JobKeyID = Production.JobKeyID AND Production.ItemKeyID = Tracking.ItemKeyID -- 嵌套子查询实现最大StageID过滤 WHERE (Tracking.ItemKeyID, Tracking.StageID) IN ( SELECT ItemKeyID, MAX(StageID) AS stageid FROM Tracking GROUP BY ItemKeyID ) )
方案2:使用窗口函数直接获取最新扫描记录(逻辑更简洁,性能更优)
如果需要在结果中直接返回每个物品的最后一次扫描ID,用ROW_NUMBER()窗口函数实现更直观:
SELECT p.jobnumber, p.ProductName, p.ItemNumber, t.StageID AS last_scan_id FROM Product p INNER JOIN heading h ON p.jobkeyid = h.jobkeyid INNER JOIN ( SELECT Tracking.JobKeyID, Tracking.ItemKeyID, Tracking.StageID, -- 按物品分组,扫描ID倒序排列,取第一条就是最新扫描记录 ROW_NUMBER() OVER (PARTITION BY Tracking.ItemKeyID ORDER BY Tracking.StageID DESC) AS rn FROM Tracking INNER JOIN Production ON Tracking.JobKeyID = Production.JobKeyID AND Production.ItemKeyID = Tracking.ItemKeyID ) t ON h.JobKeyID = t.JobKeyID WHERE h.DateDelivery = CAST(GETDATE() AS date) AND t.rn = 1 -- 仅保留每个物品的最新扫描记录
补充说明
如果你的StageID是自增ID、数值越大对应扫描时间越晚,上述逻辑可以直接复用;如果扫描时间有单独的时间字段,建议将窗口函数的排序逻辑替换为按扫描时间倒序,避免ID跳号导致的逻辑错误。
内容的提问来源于stack exchange,提问作者Rekiel97
相关产品推荐
相关产品推荐

