相信对于熟悉SQL的人来说,LEFT JOIN非常简单,采用的时候也很多,但是有个问题还是需要注意一下。假如一个主表M有多个从表的话A B C …..的话,并且每个表都有筛选条件,那么把筛选条件放到哪里,就得注意喽。
比如有个主表M,卡号是主键。

卡号 客户号
6223123456781001 1001
6223123456781002 1002
6223123456781003 1003
有个从表A,客户号、联系方式是联合主键,其中联系方式,1-座机,2-手机号码

客户号 联系方式 联系号码
1001 1 010-78586
1001 2 18810123456
1002 1 010-837433
1003 1 010-837433
如果想要查询所有卡号对应的手机号码两个字段,很简单,SQL语句如下:

SELECT A.卡号,B.手机号码
FROM A
LEFT JOIN B
ON A.客户号=B.客户号
WHERE B.联系方式='2'

相信很多人这样写,估计实际工作中也会看到这样的语句,并不是说这么写一定会错误,实际SQL表达的思想一定是要符合业务逻辑的。
前面已经说清楚,所有卡号对应的手机号码。所有卡号,所以首先肯定以A表作为主表,并且左关联B表,这样A表所有的卡号一定会显示出来,但是如果B表的筛选条件放到最外层,这样就相当于将A表关联B表又做了一遍筛选,结果就是

卡号 手机号码
6223123456781001 18810123456
就会筛选出来这么一条数据,丢失了A表中其他的卡号。
实际工作中表结构肯定没这么简单,关联的表也会很多,当有很多条件时,最好这么写

SELECT A.卡号,B.手机号码
FROM A
LEFT JOIN (
SELECT * FROM B
B.联系方式='2'
)B
ON A.客户号=B.客户号

这么写的话,A表中的数据肯定会完全保留,又能与B表的匹配,不会丢失数据。另外一种写法也会一样的效果

SELECT A.卡号,B.手机号码
FROM A
LEFT JOIN B
ON A.客户号=B.客户号
AND B.联系方式='2'

其实还是推荐推荐第二种写法,因为已经筛选B表的数据后,数据量会减少,再去关联A。效率会提高一些。(后面有时间我会验证一下)

最新文章

  1. Lunix 命令
  2. 查看Android系统给APP分配的最大堆栈
  3. C 记录
  4. My to do 12.25
  5. Linux 64位编译\链接32位程序
  6. 沈逸老师PHP魔鬼特训笔记(9)--进化
  7. ☀【DOM对象 / jQuery对象】
  8. URAL 1056(树形DP)
  9. extj6.0写增删查改(1)-------查询
  10. [leetcode-553-Optimal Division]
  11. 深入浅出多线程——ReentrantLock (一)
  12. freemarker入门实例
  13. oracle拆分一个连续的字符串
  14. Mac终端工具item2实现覆盖在屏幕上透明效果
  15. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
  16. call 和 apply方法解析
  17. array_map,array_filter,array_walk区别
  18. stingray中modal window
  19. 梯度消失与梯度爆炸 ==> 如何选择随机初始权重
  20. 20145326《Java程序设计》第二周学习总结

热门文章

  1. 【linux】监控磁盘情况并自动删除备份文件
  2. WebApi帮助类
  3. MAC下代理工具Charles使用
  4. Vuejs 高仿饿了么外卖APP 百度云视频教程下载
  5. 【Java】 int与char类型间的相互转化
  6. Codeforces Round 542 (Div. 2)
  7. JVM简介堆中新生代老年代浅析
  8. JavaScript的计时器的工作原理
  9. [ 转载 ] Tcp三次握手和四次挥手详解
  10. Qt Quick自定义样式一套