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

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
    star_ais 2015-01-30 14:49
    已采纳

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

    点赞 评论
  • danielinbiti
    danielinbiti 2015-01-29 16:08

    试了试,如果你中间表数据没问题,那结果应该就是你预期的

            IIF(AA.燃油费 IS NULL, 0,AA.燃油费) AS 燃油费  
    FROM 
    DT
    LEFT JOIN 
      AA
    ON  DT.时间 =AA.时间 AND DT.车牌号 = AA.车牌号
    ORDER BY  DT.车牌号,DT.时间 
    
    点赞 评论

相关推荐