JDE系统F4211与F4311表未关闭ST/OT单据SQL查询问题
关于SQL查询问题的解答
1. FULL OUTER JOIN是否适用?
不需要使用FULL OUTER JOIN。你的需求明确要求获取存在ST/OT配对的记录,仅需要返回两表可关联匹配的条目,FULL OUTER JOIN会返回仅在单表存在的不匹配记录,不符合需求场景。
后续你确认ST/OT配对必然存在的前提下,连外连接都不需要使用,直接用INNER JOIN即可。
2. 你编写的LEFT JOIN语句是否合理?
该写法存在逻辑冗余,实际效果等同于INNER JOIN。因为你在LEFT JOIN的WHERE条件中添加了B.DOC_TYPE IN ('OT')的过滤规则,LEFT JOIN生成的未匹配B表的记录中B.DOC_TYPE为NULL,会被该条件全部过滤,最终返回结果和INNER JOIN完全一致,反而会误导代码阅读者认为你需要保留A表的未匹配行,建议直接改成INNER JOIN更清晰准确。
3. 前导零匹配的解决方案是否正确?
你最终采用的左补零对齐的方案是DB2环境下的标准可行方案:
ON F4211.SDRORN = RIGHT(CONCAT('00000000', CAST(F4311.PDDOCO AS VARCHAR(8))), 8)
通过先拼接8位前导零、再从右侧截取8位的逻辑,刚好可以将数值类型的单据号转换为和关联字段格式一致的8位带前导零的字符串,解决格式不匹配导致的关联无结果问题。
如果所使用的DB2版本支持LPAD函数,可将关联条件简化为更易读的写法:
ON F4211.SDRORN = LPAD(CAST(F4311.PDDOCO AS VARCHAR(8)), 8, '0')
二者逻辑完全等价。
内容的提问来源于stack exchange,提问作者Joseph Gagnon
相关产品推荐
相关产品推荐

