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后面加上其它字段的连接