LEFT JOIN直接关联表和LEFT JOIN关联子查询的区别
今天分享一个工作经验,有2张表,考勤组表 和 考勤组-用户表,我想要查询所有考勤组的人员信息。
考勤组表现有数据,字段如下
考勤组-用户表现有数据,字段如下:
自然的,我用LEFT JOIN来关联两张表
-- 查询考勤组用户
SELECT *
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser user_group ON att_group.id = user_group.att_group_id
结果如下:(注意我画红圈圈的部分)
看起来似乎是这个效果,那么如果我想过滤那些已经删除的用户呢?
SELECT *
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser user_group ON att_group.id = user_group.att_group_id
WHERE user_group.is_deleted = 0
结果如下:
但是我不想要这个效果。我想要的效果是:如果考勤组一个未删除的用户都没有,应该显示考勤组的信息,而人员信息显示Null,如下:
原因是直接LEFT_JOIN考勤组信息和人员信息关联到了一行中,过滤人员的同时把考勤组也过滤掉了,因为是整行数据过滤:注意上图中我画红圈圈的部分!!所以考勤组信息自然也木有了。
修复SQL:
SELECT att_group.*, user_group.*
FROM attendence_group_attgroup att_group
LEFT JOIN (SELECT *FROM attendence_group_attgroupuser uWHERE u.is_deleted = 0) user_group ON att_group.id = user_group.att_group_id
应该先把不满足条件的人员从人员表中去除,再和考勤组关联,过滤条件提前到了人员表中,避免同时过滤掉考勤组信息。
我这么查询的最终目的是需要查询考勤组的信息,并统计每个考勤组对应的的人员个数,直接LEFT JOIN查询把考勤组也过滤掉了,导致我统计出BUG。最后是我的统计SQL:
-- 查询考勤组信息,并统计用户个数
SELECT att_group.*, count(user_group.user_id) user_nums
FROM attendence_group_attgroup att_group
LEFT JOIN (SELECT *FROM attendence_group_attgroupuser uWHERE u.is_deleted = 0 ) user_group ON att_group.id = user_group.att_group_id
GROUP BY att_group.id
另外,经过大佬指点,JOIN语句可以是组合条件,SQL可以优化成一次左查询:
-- 查询考勤组信息,并统计用户个数
SELECT att_group.id, count(group_user.user_id) user_nums
FROM attendence_group_attgroup att_group
LEFT JOIN attendence_group_attgroupuser group_user ON (att_group.id = group_user.att_group_idANDgroup_user.is_deleted = 0)
GROUP BY att_group.id
最后总结:
A表直接LEFT JOIN B表 再过滤 和 A表LEFT JOIN (B表的子查询结果)的区别是:
如果你的过滤条件只想作用于B表,那么LEFT JOIN B表的子查询结果;
如果你的过滤条件需要作用于整行关联结果,那么直接LEFT JOIN即可。
LEFT JOIN直接关联表和LEFT JOIN关联子查询的区别相关推荐
- 单行子查询 多行子查询 关联子查询 笔记
1.连接基本语法 select columns_list from table_1 innner join table_2 on join_condition; eg:select e.empno,e ...
- server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
4.1.查询的类型 declare @value as int set @value = 50 select 'age:'as age,2008 years,@valueas va --这种查询时跟 ...
- SQL中的关联子查询
目录 关联查询 例子 分解相关的嵌套查询 与不同的表一起使用 关联子查询与内部联接 哪个更快? 哪个更容易阅读? 哪一个更好? HAVING子句中的关联子查询 在本文中,我们将查看几个示例并将关联子查 ...
- SQL进阶之关联子查询练习
SQL进阶之关联子查询 一.关联子查询简介 二.关联子查询实操 1.CreateTable 2.Sample 一.关联子查询简介 通过关联表内部条件从而达到查询效果 二.关联子查询实操 注:版本使用: ...
- Oracle 的关联子查询(correlated subquery) 简介.
相信 接触过 ocp考题既, 都会见到 correlated subquery的字眼. correlated subquery的中文名称就是相关子查询呢? 1. 什么是子查询 这个很简单, 子查询就 ...
- order by 子查询_视图,子查询,标量子查询,关联子查询
视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...
- Oracle 数据库的子查询(关联子查询)
文章目录 一.子查询结果返回一个值(单列单行) 二.子查询结果返回多行(单列多行) 三.子查询结果返回多列多行 四.关联子查询 (一)子查询执行顺序 (二)exists 关键字 五.子查询总结 六.关 ...
- exist-in和关联子查询-非关联子查询
对于exist和in,大家的一致看法如下: 1.in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而 外面的表结果集大的情况. 2.exists是外面的表位驱动表,子查询 ...
- SQL子查询和关联子查询
子查询:将用来定义视图的SELECT语句直接用于FROM子句中. SELECT <列名1>, <列名2>, - FROM (<SELECT语句>) AS <视 ...
最新文章
- ionic4 select 去掉确定取消按钮_word文档中的水印如何去掉,有三种方法,你最喜欢哪种?...
- Trie树详解及其应用
- 使用cacti对mysql监控的图像解释_Linux下的监控软件cacti的安装与配置
- 习惯 积累 沉淀
- Liferay Portal额外研究-银狐999
- [Java基础] Java中List.remove报错UnsupportedOperationException
- 3 vue 线条箭头_线条眉要如何处理才能更自然?
- Windows平台下go编译器LiteIDE的安装和使用
- 三星 android 截屏,三星S7怎么截屏 3种三星S7截图方法
- 走在WCF学习的路上---印在脑子里的点点滴滴(两种元数据交换方式的优缺点)...
- python一对一视频教学-使用Python的Tornado框架实现一个一对一聊天的程序
- vue 背景透明度_Visual Studio 2017 设置透明背景图
- eclipse反编译后的文件去除注释 /** 123 **/
- 银行窗口排队叫号系统实现
- 桌上远远演唱特别行政区
- CVE-2018-18311 阿里云漏洞修复 RHSA-2019:0109-Important: perl secur
- CSS3颜色不透明度如何设置?
- 点击reset按钮失效,不能清空输入框。
- SQL Server 索引碎片和填充因子
- TJ Wi-Fi不能使用的解决的办法