left join on深度解析

table test1
--------------------------------------------------------------------
                      Id                                                                name age married profiles(ntext)
58A757B0-A679-41B1-9DD6-128D8B8AD8C2                       yu     10   0                kkkk
887CD472-32AC-431C-81B1-D32C2941C38D                       qw     10   0                kkkk
3BC6ABCE-BD36-4559-A529-FBCA30B0E40A                       yu      10   0                kkk
8F50F387-DDEF-4BCD-A6C2-6C6E6CE63374                        yu      10   0                 kk
B4D1754C-3BC1-40D8-8619-71AC7546F24A                        qw     10   0               kkkk
1A720398-6C97-4803-B6E3-1ECDB2E5AFAC                        gh      10   0              kkkk
F448B593-D8C5-4CFD-9E5E-93CB4E38F1C6                         yu      5    1                kk


(由于结果集太长,不显示)
select * from test1 A
left join test1 B on A.name=B.name
此处结果集为21个,就是执行了简单的左连接

select * from test1 A
left join test1 B on A.name=B.name and convert(nvarchar(255),B.profiles)='kk'
此处结果集为11个,on后面的条件都是用来修饰表B的,如果是convert(nvarchar(255),A.profiles)='kk',这是没有作用的。
意思就是现在的表B为,(select * from test1 where profiles='kk')。此时A,B表再连接。(此处只代表显示效果,并不代表执行过程)

select * from test1 A
left join test1 B on A.name=B.name and A.id=B.id and convert(nvarchar(255),B.profiles)='kk'
where convert(nvarchar(255),A.profiles)='kkk'
此处结果集为七个,此处的关联条件变成了两个。关联时,既要name相等,同时又要id相等的才进行关联。此处可以处理一些组合主键的问题。

此处可以处理问题:
假如一个在一个多语表中,字段language中有US,Tw,CN三种语言。name字段下的每一个值,都应该具有这三种语言。
此处就可以查出具有CN,但不具有Tw的name。

select * from test2 A
left join test2 B on A.name=B.name and B.language='Tw'
where A.language='CN' and B.name=null(此处name和language为组合主键)

当然如果你是多个组合主键,那么其余就可以在on后面加上其它字段的连接

转载于:https://www.cnblogs.com/Glowd/archive/2012/09/09/glowd.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值