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

Access SQL查询异常:日期关联时丢失SKU3特定价格记录的排查

问题描述

我正在开发存储价格(PC表)与折扣(DC表)信息的Access数据库,需要实现以下查询效果:

  • 展示所有价格记录(即使无对应折扣)
  • 同时展示所有与价格日期范围存在重叠(含折扣起始日与价格结束日为同一天)的折扣记录

当前使用左连接SQL语句查询,但发现SKU3在2022年5月1日至5月11日的价格记录丢失,而SKU4的无折扣价格记录却能正常显示。原SQL语句如下:

SELECT PC.SKU, PC.Flavor, DC.STD, DC.END, DC.DID, DC.AMT, DC.QTY, PC.STD, PC.END, PC.FL, PC.FOB
FROM PC LEFT OUTER JOIN DC ON PC.SKU = DC.SKU
WHERE (([DC]![STD]>=[PC]![STD] And [DC]![STD]<=[PC]![END]) 
OR ([DC]![END]>=[PC]![STD] And [DC]![END]<=[PC]![END]) 
OR ([DC]![STD] IS NULL AND [DC]![END] IS NULL));
问题原因

左连接后在WHERE子句中对DC表的日期条件进行过滤,会把有对应DC记录但日期不重叠的PC记录直接排除。比如SKU3存在DC记录,但这些DC记录的日期范围和PC的2022.5.1-5.11不重叠,此时WHERE条件不满足,这条PC记录就被过滤掉了;而SKU4没有任何DC记录,符合[DC]![STD] IS NULL AND [DC]![END] IS NULL的条件,所以能正常保留。

修正后的SQL语句

把日期重叠的判断条件从WHERE子句移到LEFT JOIN的ON子句中,这样左连接时只会匹配符合日期条件的DC记录,同时强制保留所有PC记录。另外给重复字段名添加别名,避免查询结果中字段名冲突:

SELECT PC.SKU, PC.Flavor, DC.STD AS DC_STD, DC.END AS DC_END, DC.DID, DC.AMT, DC.QTY, 
       PC.STD AS PC_STD, PC.END AS PC_END, PC.FL, PC.FOB
FROM PC LEFT OUTER JOIN DC 
ON PC.SKU = DC.SKU 
AND (
    ([DC].[STD] >= [PC].[STD] AND [DC].[STD] <= [PC].[END])
    OR ([DC].[END] >= [PC].[STD] AND [DC].[END] <= [PC].[END])
    OR ([DC].[STD] IS NULL AND [DC].[END] IS NULL)
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:25:24