Office中国论坛/Access中国论坛

标题: LEFT JOIN 用法一点心得 [打印本页]

作者: andymark    时间: 2008-11-26 20:47
标题: LEFT JOIN 用法一点心得
LEFT JOIN 懂一点SQL语法的人都不会陌生,也没什么好写的,网上相关的语法书一大堆

最近,在做LEFT JOIN一个查询时,却怎么都查询不了自已想要的数据,真是奇怪透了。

在应用中,要把订单的结余数量统计出来,看看那些订单已经OK ,用LEFT JOIN是个不错的选择,为了方便理解,这里分开几个查询实现:

订单查询:

  SELECT 订单表.OrderNo, 订单表.CPBH, Sum(订单表.SL) AS 订单总数 FROM 订单表 GROUP BY 订单表.OrderNo, 订单表.CPBH;

收货查询:

SELECT 送货表.OrderNO, 送货表.CPBH, Sum(送货表.SL) AS 收货总数 FROM 送货表 GROUP BY 送货表.CPBH, 送货表.OrderNO;

用LEFT JOIN 把订单结存数列出来

SELECT 订单查询.OrderNo, 订单查询.CPBH, 订单查询.订单总数, 收货查询.收货总数, (nz(订单查询.订单总数)-nz(收货查询.收货总数)) AS 结余订单数
FROM 订单查询 LEFT JOIN 收货查询 ON (订单查询.CPBH=收货查询.CPBH) AND (订单查询.OrderNo=收货查询.OrderNO);


[attach]33472[/attach]

出来的结果却不是我想要的

改成 INNER JOIN 方式
SELECT 订单查询.OrderNo, 订单查询.CPBH, 订单查询.订单总数, 收货查询.收货总数, (nz(订单查询.订单总数)-nz(收货查询.收货总数)) AS 结余订单数
FROM 订单查询 INNER JOIN 收货查询 ON (订单查询.OrderNo = 收货查询.OrderNO) AND (订单查询.CPBH = 收货查询.CPBH);

收货总数能正常显示


[attach]33473[/attach]

为什么INNER JOIN可以正常显示收货总数,而LEFT JOIN不能显示呢 ,不知大家发现问题没有

唉,弄了一个下午,总算搞清楚什么回事,LEFT JOIN 后面查询语句,如果是分组查询的,GROUP BY 的排序顺序必须和SELECT 的一致

把收货查询:

SELECT 送货表.OrderNO, 送货表.CPBH, Sum(送货表.SL) AS 收货总数 FROM 送货表 GROUP BY 送货表.CPBH, 送货表.OrderNO;


改为:
SELECT 送货表.OrderNO, 送货表.CPBH, Sum(送货表.SL) AS 收货总数 FROM 送货表 GROUP BY  送货表.OrderNO,送货表.CPBH

执行LEFT JOIN 一切正常
作者: tmtony    时间: 2008-11-26 20:51
20%的问题常常会花了80%的时间,长了知识, 少了弯路
作者: andymark    时间: 2008-11-26 20:57
还是不明白,为什么INNER JOIN GROUP BY 可以不必按顺序,而LEFT JOIN却不能
作者: tmtony    时间: 2008-11-26 21:19
可能是Group by 就决定了表的排序方式, 如果是左外连接, 如果 右边没有对应的话,还要填补空值. 如果排序方式对应不起来, 就会错乱
作者: Henry D. Sy    时间: 2008-11-26 21:29
谢谢分享!!
作者: t小宝    时间: 2008-11-26 21:31
留个名,,以后有用
作者: rjacky    时间: 2008-11-26 21:34
这里也顶一个
作者: zyp    时间: 2008-11-27 10:58
谢谢andymark

虽然之前没有遇到这种情况, andymark的经验给我们提供了一种解决问题的思路.
作者: NBZHOUYURU    时间: 2008-12-11 11:45
太谢谢了,我为了这个问题试了不知道多少次。看了楼主的介绍一试果然问题解决了。太谢谢了。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3