首页 新闻 赞助 找找看

sql左连接或右连接的where条件问题

0
悬赏园豆:20 [已解决问题] 解决于 2014-11-18 16:40

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没数据时就会查不到,这种情况应该如何解决?求大神

七步、的主页 七步、 | 初学一级 | 园豆:78
提问于:2014-11-18 15:47
< >
分享
最佳答案
1

这个不需要解决啊,没有数据当然应该查不到了。

你如果需要错误的设计,那找大神可没有用。

收获园豆:15
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-11-18 15:54

我是说没有数据的时候显示为空,比如select a.A,b.B,c.C,如果b表或c表没有数据的话也可以select出结果,只是b.B和c.C那是null,a.A正常显示

七步、 | 园豆:78 (初学一级) | 2014-11-18 16:06

@七步、:你只要学会这样写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

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-11-18 16:13

@爱编程的大叔: ok,解决了,跟3楼的说法是一样的,就是先筛选再连接,多谢!

七步、 | 园豆:78 (初学一级) | 2014-11-18 16:33
其他回答(2)
0

where 是对连接的整体做限制,on是只对连接做限制,你说的加副表的条件可以在外面再做个查询 再加where XX is not null

风醉 | 园豆:1197 (小虾三级) | 2014-11-18 15:59
0

当然会查不到  你在最后的where 加b,c的条件查询 实际是对连接后的表做筛选

要加b,c的条件 你可以在 表b,c后面加where条件,也就是先筛选在连接

收获园豆:5
AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-18 16:02

怎么先筛选?在UserAPPBind b with(nolock) right join UserAPPInfo a with(nolock) on a.PhoneID=b.PhoneID这句话的表b后面加where么?不对啊,还是说把b表筛选出的数据放在临时表里再用临时表做连接?

支持(0) 反对(0) 七步、 | 园豆:78 (初学一级) | 2014-11-18 16:25

@七步、: select * from A 

             right join B where .......... on A.id=B.aid

             left join C where ......... on C.id=A.aid

             where .................... 

支持(0) 反对(0) AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-18 16:38

@七步、: select * from B

             right join A where .......... on A.id=B.aid

             left join C where ......... on C.id=A.aid

             where ....................

支持(0) 反对(0) AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-18 16:39

@Poison゜: 这样语法是不对的

支持(0) 反对(0) 七步、 | 园豆:78 (初学一级) | 2014-11-18 16:42

@七步、: 那就这样咯

 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 ....................

支持(0) 反对(0) AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-18 16:49

@Poison゜: 对,就是这样~O(∩_∩)O!

支持(0) 反对(0) 七步、 | 园豆:78 (初学一级) | 2014-11-18 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册