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

SQL查询:找出存在完全不同扫描内容的包裹ID

问题分析

原SQL语句的问题在于:只要包裹内某一个扫描里存在单个EPC和另一个扫描无重叠,就会把该包裹纳入结果,而非判断两个扫描的所有EPC完全无交集。比如包裹2中可能存在某个EPC仅在其中一个扫描里,但两个扫描整体有重叠EPC,原语句仍会误判为符合条件。

修正方案

我们需要明确判断:包裹内存在至少一对不同的扫描,且这两个扫描的EPC集合完全没有交集。以下是修正后的SQL:

SELECT DISTINCT ps1.package_id
FROM package_scans ps1
JOIN package_scans ps2 
  ON ps1.package_id = ps2.package_id 
  AND ps1.scan_id < ps2.scan_id  -- 避免重复扫描对(如A-B和B-A)
WHERE NOT EXISTS (
    -- 检查两个扫描是否存在共同EPC,若不存在则说明完全不同
    SELECT 1
    FROM scan_content sc1
    JOIN scan_content sc2 
      ON sc1.epc = sc2.epc
    WHERE sc1.scan_id = ps1.scan_id
      AND sc2.scan_id = ps2.scan_id
)
逻辑说明
  • 通过package_scans自连接,获取同一包裹内的所有不同扫描对,ps1.scan_id < ps2.scan_id用于避免重复的成对扫描,提升查询效率。
  • NOT EXISTS子句检查这对扫描是否有共同EPC:如果不存在任何相同的EPC,说明两个扫描的EPC完全不同,符合需求。
  • 用DISTINCT去重,确保每个符合条件的包裹只返回一次。
可选优化(显式过滤单扫描包裹)

虽然自连接后单个扫描的包裹不会出现在结果中,但显式过滤能让逻辑更清晰:

SELECT DISTINCT ps1.package_id
FROM package_scans ps1
JOIN package_scans ps2 
  ON ps1.package_id = ps2.package_id 
  AND ps1.scan_id < ps2.scan_id
-- 过滤仅含单个扫描的包裹
WHERE EXISTS (
    SELECT 1 FROM package_scans ps3 
    WHERE ps3.package_id = ps1.package_id 
    GROUP BY ps3.package_id 
    HAVING COUNT(DISTINCT ps3.scan_id) >=2
)
AND NOT EXISTS (
    SELECT 1
    FROM scan_content sc1
    JOIN scan_content sc2 
      ON sc1.epc = sc2.epc
    WHERE sc1.scan_id = ps1.scan_id
      AND sc2.scan_id = ps2.scan_id
)

内容的提问来源于stack exchange,提问作者Budenzauber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:12:08