您的位置:首页 > 数据库

sql 左连接(left join),右链接(right join) 条件放在on和放在where 的区别

2012-10-15 20:41 531 查看
sql 左连接(left join),右链接(right join) 条件放在on和放在where 的区别,到底区别在哪呢?

我们来做一个测试,现在我们有两个表,产品表(Product) 销售表(Sales),

现在我们要统计某一个产品的销售数量,并且外加一个条件是类型等一个特殊的类型。

--产品表

Create table #Product(

ID int identity(1,1), --产品ID

Name varchar(50), --产品名称

PdType char(2) --产品类型

)

--销售表

Create table #Sales(

Product_ID int,--产品ID

Name varchar(50),--销售名称

Qty int--销售数量

)

--添加数据

Insert into #Product(Name,PdType)

values('product1','01')

Go

Insert into #Product(Name,PdType)

values('product2','01')

Go

Insert into #Product(Name,PdType)

values('product3','01')

Go

Insert into #Product(Name,PdType)

values('product4','02')

Go

Insert into #Product(Name,PdType)

values('product5','02')

Insert into #Sales(Product_ID,Name,Qty)

values(1,'PO-01',1)

go

Insert into #Sales(Product_ID,Name,Qty)

values(1,'PO-02',1)

go

Insert into #Sales(Product_ID,Name,Qty)

values(1,'PO-03',1)

--条件放在on后面

Select A.Name,isnull(sum(B.qty),0) as AllQty

from #Product A left join #Sales B on A.ID=B.Product_ID and PdType='02'

where A.ID=1

group by A.Name

--结果

Name AllQty

product10

--条件放在where 后面

Select A.Name,isnull(sum(B.qty),0) as AllQty

from #Product A left join #Sales B on A.ID=B.Product_ID

where A.ID=1 and PdType='02'

group by A.Name

--结果

Name AllQty

找不到数据,这个并不是我们想要的结果,我们要的结果是上面的那种,没有销售,至少要告诉我们这个产品是存在的,只是没有销售而已,但后面一种就直接产品都没有了。

总结:

看到这里应该明白其中的区别,如果条件放在on后面,代表这个条件参加了join运算,这时候产品关联的数量是null,但是产品是有的。

放在where条件后面,如果join有值,但是条件不满足就会过滤掉。

所有以后大家写left join 或 right join ,就要主要了,内连接没有这个问题。

如需转载请注明本文出处:http://www.cf17.com/html/article/62.html ,谢谢。

http://www.cf17.com 中的技术文档中有我平时总结的一些经验,并在逐步更新中,也欢迎到这里来交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: