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 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了