select a.Phone,IsNull(c.Icon,'') as Icon,IsNull(c.Skin,'') as Skin,@numLock as NumLock,IsNull(b.QLUserID,'') as QLUserID,IsNull(b.QLUserName,'') as QLUserName,IsNull(b.IsCurrent,'') as IsCurrent,IsNull(b.Valid,'') as UserValid
from UserAPPBind b with(nolock) right join UserAPPInfo a with(nolock) on a.PhoneID=b.PhoneID left join UserAPPPerson c with(nolock) on a.PhoneID=c.PhoneID where a.PhoneID=@PhoneID
a,b,c三张表通过PhoneID互联,a是主表,b、c是副表,需要实现的效果是查询出三张表的数据,当副表没有数据时显示为空,这里用到了左连接和右连接,基本效果是达到了,但是在写where条件时只能加主表a的条件(如a.PhoneID=@PhoneID),但不能加副表的条件,加了以后b、c没数据时就会查不到,这种情况应该如何解决?求大神
这个不需要解决啊,没有数据当然应该查不到了。
你如果需要错误的设计,那找大神可没有用。
我是说没有数据的时候显示为空,比如select a.A,b.B,c.C,如果b表或c表没有数据的话也可以select出结果,只是b.B和c.C那是null,a.A正常显示
@七步、:你只要学会这样写SQL就没有问题了。
Select a.*, b.x, c.y from a
left outer join (Select * from tablex where condition1)b
on a.id=b.id
left outer join (Select * from tabley where condition2)c
on a.id=c.id
where condition3
@爱编程的大叔: ok,解决了,跟3楼的说法是一样的,就是先筛选再连接,多谢!
where 是对连接的整体做限制,on是只对连接做限制,你说的加副表的条件可以在外面再做个查询 再加where XX is not null
当然会查不到 你在最后的where 加b,c的条件查询 实际是对连接后的表做筛选
要加b,c的条件 你可以在 表b,c后面加where条件,也就是先筛选在连接
怎么先筛选?在UserAPPBind b with(nolock) right join UserAPPInfo a with(nolock) on a.PhoneID=b.PhoneID这句话的表b后面加where么?不对啊,还是说把b表筛选出的数据放在临时表里再用临时表做连接?
@七步、: select * from A
right join B where .......... on A.id=B.aid
left join C where ......... on C.id=A.aid
where ....................
@七步、: select * from B
right join A where .......... on A.id=B.aid
left join C where ......... on C.id=A.aid
where ....................
@Poison゜: 这样语法是不对的
@七步、: 那就这样咯
select b.* a.*,c.* from B
right join (select * from A where ..........) a on a.id=B.aid
left join (select * from C where ..........) c on c.id=A.aid
where ....................
@Poison゜: 对,就是这样~O(∩_∩)O!