为什么我的Left Join 无效,求大神看看我的SQL 应该怎么写

Pc498471249 2014-08-12 02:58:29
客户表 Customer
Id 客户编号 Name 客户名称
A01 张三
A02 李四
A03 王五

订单统计表 OrderGroup
Id 订单统计编号 CustomerId 客户编号 OrderDate 订单统计日期 CurrentDatePrice 当日订单总金额 CurrentDateCount 当日订单总数
1 A01 20140812 100 4
2 A02 20140812 50 2
3 A03 20140811 43 1

订单统计表的结构为, 一个客户一天 只存在一条记录,如果在当天下了多个订单,在订单统计表中只累计当日订单总金额和当日订单总数 ,也有可能客户在今天没有下订单, 那么查询出来这个客户今日的统计就是null ,所以我用了left join查询 ,SQL语句如下

select c.Id,c.Name,og.OrderDate,og.CurrentDatePrice,og.CurrentDateCount from
Customer as c left join OrderGroup as og on c.CustomerId=og.CustomerId and OrderDate='20140812'

我想要得到的结果数据为
A01 张三 20140812 100 4
A02 李四 20140812 50 2
A03 王五 null null null

但是得到的结果有点出入。 只显示了今日下过单的客户的数据, 今日没下过单的客户数据为什么没有显示出来,
难道left join 不是这么用么 求大神指点

...全文
612 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
专注or全面 2014-08-13
  • 打赏
  • 举报
回复
select c.Id,c.Name,og.OrderDate,og.CurrentDatePrice,og.CurrentDateCount from Customer as c left join OrderGroup as og on c.Id=og.CustomerId and OrderDate='20140812' 这种写法是只取满足OrderDate='20140812'的数据与OrderGroup 连接, 不满足OrderDate='20140812'的也显示出来,只是关联的OrderGroup 中相关的列全部为空 select c.Id,c.Name,og.OrderDate,og.CurrentDatePrice,og.CurrentDateCount from Customer as c left join OrderGroup as og on c.Id=og.CustomerId where OrderDate='20140812' 这种写法是只取满足OrderDate='20140812'的数据与OrderGroup 连接, 不满足OrderDate='20140812'的不显示出来
qqm05 2014-08-13
  • 打赏
  • 举报
回复
引用 6 楼 Pc498471249 的回复:
[quote=引用 5 楼 fredrickhu 的回复:] 又看见LEFT JOIN后面的过滤条件问题了 AND条件的话是先过滤再LEFT JOIN WHERE的话是JOIN了再过滤 是不一样的
请版主介绍一下 left join 过滤条件和 where 过滤条件的区别。 [/quote] 人家不是已经说得很清楚了么
Pc498471249 2014-08-13
  • 打赏
  • 举报
回复
引用 5 楼 fredrickhu 的回复:
又看见LEFT JOIN后面的过滤条件问题了 AND条件的话是先过滤再LEFT JOIN WHERE的话是JOIN了再过滤 是不一样的
请版主介绍一下 left join 过滤条件和 where 过滤条件的区别。
--小F-- 2014-08-12
  • 打赏
  • 举报
回复
又看见LEFT JOIN后面的过滤条件问题了 AND条件的话是先过滤再LEFT JOIN WHERE的话是JOIN了再过滤 是不一样的
「已注销」 2014-08-12
  • 打赏
  • 举报
回复
你写的代码没有问题,如果说你将后边的 and og.OrderDate='20140812' 写成 where og.OrderDate='20140812',则不会出现今天没下过订单的客户的数据。至于left join你用的没有错。

--------------
create table customer
(
id varchar(50) primary key ,
name varchar(50)
)
insert into customer(id,name)
select 'A01','张三' union
select 'A02','李四' union
select 'A03','王五' union
select 'A04','韩六' union
select 'A05','宋七'
create table ordergroup
(
id int primary key identity(1,1),
customerId varchar(50),
orderDate datetime,
currentDatePrice money,
currentDateCount int
)
insert into ordergroup(customerId,orderDate,currentDatePrice,currentDateCount)
select 'A01','20140812',100,4 union
select 'A02','20140812',50,2 union
select 'A03','20140811',43,1

select c.Id,c.Name,og.OrderDate,og.CurrentDatePrice,og.CurrentDateCount from
Customer as c left join OrderGroup as og on c.Id=og.CustomerId and OrderDate='20140812'


结果截图;
Pc498471249 2014-08-12
  • 打赏
  • 举报
回复
查出来不是啊。 只有匹配的
t101lian 2014-08-12
  • 打赏
  • 举报
回复
王五 在今天12号没有订单不就是 null吗
t101lian 2014-08-12
  • 打赏
  • 举报
回复
没有什么问题, 就是楼主这样写的。。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧