先举个例子,我们去买饼干,我想要的饼干是绿色威化饼干,这时候Left Join On()里就是“绿色”和“威化饼干”两个条件。必须先同时符合这两个条件,买回来绿色威化饼干,我们才能谈后续对于它的条件筛选:比如说找到方形的、圆形的、三角形的。

但如果我们先只给On()传输一个“绿色”,我们买回来的是可能是绿色曲奇饼干、绿色苏打饼干、绿色夹心饼干等。这时再追加一个“威化饼干”的and条件,虽说也会找到一些“绿色威化饼干”,但是会出现许多多余的、错误的饼干,这都是我们不需要的,我们却费劲买回来了。更不要提后续对于饼干大小、形状等其他条件的筛选啦。

理解了这个例子以后,再来看On、Where、And条件也不迟。

在 mapper.xml中填写SQL语句,在<if>标签中加入and条件来拼接,但在拼接and之前要先有个where条件。可以写成where 1 = 1,再给后面拼接其他条件。如果不加where直接拼接and,编译器会认为and后的条件为联合查询时的条件,不能起到过滤作用。

select sl.create_time,sl.username,sl.operate_type,sl.log_content,sdi.item_text
from sys_log sl
left join sys_dict_item sdi
on (sl.operate_type = sdi.item_value and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e")
where 1 = 1
<if test="SysLogTest.username != null">and username like concat ('%', #{SysLogTest.username}, '%')
</if>
<if test="SysLogTest.selectCreateTime != null">and datediff(create_time, #{SysLogTest.selectCreateTime})= 0
</if>
<if test="SysLogTest.logContent != null">and log_content = #{SysLogTest.logContent}
</if>

这里我们着重要注意的点是Left Join On()里的联查条件。在此处我们有两种写法,第一种是常规写法,我们先将两张表联合成一张临时表,然后再在其中根据and条件筛选数据:

left join sys_dict_item sdi
on (sl.operate_type = sdi.item_value)
where 1 = 1
and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e"
and ......

或者是在on中加入几个先决and条件,先根据on中的条件联合两张表生成一张临时表,然后再在这张临时表中根据and条件筛选:

left join sys_dict_item sdi
on (sl.operate_type = sdi.item_value and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e")
where 1 = 1
and ......

这样写实际上是有区别的,在联查操作中,会先根据Left Join On()中的条件合成一张临时表,再进行后续的查询。第一种写法只会根据 sl.operate_type = sdi.item_value 这个条件,合成临时表,再查询;第二种写法则需要同时符合两个条件,再合成临时表。看起来似乎两者并没有什么区别,但实际上会产生很大的偏差。

这是按照第二种写法生成的正确数据,因为我们给item_text对应了我所需要的dict_id,先根据on()中的两个条件生成了数据表,再生成数据。再做后续的筛选操作,没有任何问题。

但如果我们先生成临时表,表中item_text可能已经不是我所需要的item_text,它指向了错误的dict_id。生成数据时,也就完全不是我想要的,后续的任何操作也都会产生错误。

一定要注意On、Where、And的使用顺序带来的差异。

多表联查时的条件筛选相关推荐

  1. 学习Python处理Excel 难度0级别 多表合并、多条件筛选、找出重复项、去重

    #本代码要点:多表合并.多条件筛选.找出重复项.去重 #主题:计算特定两个时间周期内回店且消费的重复客户清单以及未再次回店的客户清单 #EXCEL工作表:一维表 #备注:假设会员姓名不存在重名:否则找 ...

  2. ThinkPHP 数据库多表联查 where多条件查询

    数据库多表联查 Db::table('think_artist') ->alias('a') // alias 表示命名数据库的别称为a ->join('think_work w','a. ...

  3. 多表联查时的sql删除语句的写法,即级联删除,将相关联的数据级联删除

    mysql多表关联删除 DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 1 delete from t1 where 条件2 delete t1 from t1 w ...

  4. MybatisPlus多表联查分页多条件查

    一.mapper 注意: 1,${ew.customSqlSegment}不用管加上就行,主要作用是让wrapper中的sql自动拼接上去,分页会自动拼接@select中只需要让多表关联上就行 2,g ...

  5. Oracle多表联查时,某个字段由逗号分割的字符串组成,关系是此字符串切割后,对应另一张表某个字段,如何实现一条sql完成查询?

    此需要类似于在sql中,使用in的场景,只是in是一对多,此处需要切割后的多对多. 这里我使用了Oracle函数进行处理,取交集 CREATE OR REPLACE FUNCTION "FU ...

  6. 查询两张表 然后把数据并在一起_工作表数据查询时,类似筛选功能LIKE和NOT LIKE的应用...

    大家好,我们继续讲解VBA数据库解决方案,今日讲解第53讲内容:工作表查询时,类似于筛选功能的LIKE和NOT LIKE 的应用.大家在工作的时候,利用EXCEL操作,筛选是必不可少的工具之一.例如我 ...

  7. Excel VBA 多条件筛选及汇总统计

    Excel VBA 多条件筛选 AdvancedFilter 汇总统计 sumproduct Range与Array交换 在日常工作中,面对Excel表格数据,为了分类进行统计,通过对表格数据筛选获取 ...

  8. SQLServer千万级数据量多表联查优化查询记录

    1.数据分区 1.1  通过时间列将大表分为多个小表,缩小数据范围,减少扫描纪录数,这样添加分区索引后存在多个B+索引,单分区查询时相对应索引树也小 1.1.1   在本地任意盘符下创建存放小表的文件 ...

  9. SQLSERVER 数据库多表联查重复值问题

    之前在网上找了好就都没有找到我想要的,都说使用distinct 但是没有什么用,自己苦苦的搞了半个小时终于解决了,具体方法是子查询解决的. 一.什么是之查询 在SQL语言中,一个SELECT-FROM ...

最新文章

  1. 看大众点评如何通过实时监控系统CAT打造7*24服务
  2. Java 20年:JVM虚拟化技术的发展
  3. access 合并多行字符串_第20p,什么是字符串?Python中的str
  4. python3.5 mysql 库_Python 3.5 连接Mysql数据库(pymysql 方式)
  5. ABAP制作密码输入框
  6. Executor框架、ThreadPoolExecutor、3种常见的线程池
  7. JavaScript实现depth First Search深度优先搜索算法(附完整源码)
  8. spring boot中 使用http请求
  9. 没有可用软件包 jenkins。_Jenkins分布式构建与并行构建
  10. setdefault_Java语言环境setDefault()方法及示例
  11. 回溯法基本思想_回溯算法(一)
  12. 计算机绘图课程选用课本,机械制图课程学习指南
  13. 广州地铁的速度与激情
  14. 计算机病毒特征码主要有,基于行为分析和特征码的计算机病毒检测技术
  15. TcaplusDB君 · 行业新闻汇编(7月2日)
  16. python实现自动拨打电话_twilio python自动拨打电话,播放自定义mp3音频的方法
  17. 《伟大是熬出来的》冯仑与年轻人闲话人生之三
  18. [转贴] 这是我和一个偷吃禁果的女孩子的故事
  19. opencv学习_7 (颜色空间)
  20. css去掉ie浏览器输入框后面的小叉叉,和密码框后面的小眼睛

热门文章

  1. 异常解决java.lang.ClassNotFoundException: org.springframework.boot.actuate.endpoint.PublicMetrics
  2. Pandas中DataFrame基本函数整理(全)
  3. 用python绘制熊猫图案_在matplotlib中绘制熊猫日期
  4. 老子云打造3D技术云服务平台,加速三维互联网变革进程
  5. 何恺明新作品:VITDet
  6. Luogu P1850换教室【期望dp】By cellur925
  7. Access-VBA
  8. 三国志战略版赤壁之战如何开荒?
  9. CSP 201712-2 游戏
  10. Hadoop之Lzo压缩配置