You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:36:03