star_ais 2015-01-29 15:11 采纳率: 100%
浏览 2912
已采纳

ACCESS数据库执行LEFT JOIN存在的问题

首先说明:
1. 该SQL语句用于ACCESS执行。
1. 为表述清楚,SQL中的参数本来应该是“?”,我写成了英文begin和end表示开始时间和结束时间。
1. 问题:当单个执行FROM语句后每个SELECT语句时,可以查询出来数据。可是用LEFT JOIN后,查不出数据了。当把ON的条件放宽为“DT.时间 =AA.时间”或者“DT.车牌号 = AA.车牌号”时都有数据,但是这样做不符合检索要求。请各位同仁帮忙看看

SELECT DT.时间,DT.车牌号,
       IIF(AA.燃油费 IS NULL, 0,AA.燃油费) AS 燃油费  
FROM 
(SELECT FORMAT(DATEADD('m',BS.NUM,begin),'yyyy年MM月') AS 时间,
        BC.车牌号
   FROM B_SYSDATE AS BS, B_车辆信息表 AS BC
  WHERE BS.NUM <= DATEDIFF('m',begin,end) ) AS DT
LEFT JOIN 
  (SELECT FORMAT(A.交易时间,'yyyy年MM月') AS 时间 ,
          SUM(A.金额) AS 燃油费,B.车牌号
     FROM A_车辆充油明细 AS A ,B_车辆信息表 AS B
    WHERE A.卡号 = B.油卡号 AND A.交易时间 BETWEEN begin AND end
    GROUP BY FORMAT(A.交易时间,'yyyy年MM月'),A.卡号,
          B.车牌号) AS AA
ON  DT.时间 =AA.时间 AND DT.车牌号 = AA.车牌号
ORDER BY  DT.车牌号,DT.时间 

  • 单独查的结果
  • DT表记录
  • 时间 车牌号
  • 2015-01 A
  • 2015-02 A
  • 2015-03 A
  • 2015-01 B
  • 2015-02 B
  • 2015-03 B

  • AA表记录

  • 时间 车牌号 燃油费

  • 2015-02 A 300

  • 2015-02 B 500

我**预期的效果**是选择一个时间段,比如开始日期选择2015-01,结束日期选择2015-03,但是只有2月份有数据,因此查询出来的数据列表应该如下显示:

  • 时间 车牌号 燃油费
  • 2015-01 A 0
  • 2015-02 A 300
  • 2015-03 A 0
  • 2015-01 B 0
  • 2015-02 B 500
  • 2015-03 B 0

    但是使用JOIN查询后的实际记录集如下:

  • 时间 车牌号 燃油费

  • 2015-01 A 0

  • 2015-02 A 0

  • 2015-03 A 0

  • 2015-01 B 0http://ask.csdn.net/#

  • 2015-02 B 0

  • 2015-03 B 0

  • 写回答

2条回答 默认 最新

  • star_ais 2015-01-30 14:49
    关注

    最终还是自己搞定。现在和大家分享一下。
    我将ON条件修改为“ON **DT.时间 =FORMAT(AA.时间,'yyyy年MM月') **AND DT.车牌号 = AA.车牌号 ”
    红色部分为修改部分。其实按照SQL语句看,AA.时间的格式本来就是'yyyy年MM月',但是系统就是不认,所以就二次格式化,结果就认了。ACCESS有太多应该但是却依然不符合常理的东西。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料