当前位置: 首页 > news >正文

sql一关联多查询时否定筛选出现的问题的解决

问题:一方关联多方查询时执行否定筛选,结果包含未通过筛选的项。

我们规定一方为父,多方为子,我们希望子未通过筛选时,结果也不出现对应的父。

 

查询部门及部门下的所有员工。

SELECT * FROM department LEFT JOIN employee ON department.id = employee.did;

查询不是员工Tom所在的部门及部门下的所有员工。

第一想法是:SELECT * FROM department LEFT JOIN employee ON department.id = employee.did WHERE employee.name != 'Tom';

但是结果如下,结果仍包含部门 1 ,当mybatis等处理结果时,就会为部门 1 创建实例。这不是我们想要的。

解决1:not in 的思想(这个很慢,直接看解决2)

not in 的思想是:先查出条件句的肯定,然后外部用not in筛选。

这里就是,先找出有员工Tom的部门,然后筛选不是这个部门的所有部门及员工。

SELECT *  FROM department LEFT JOIN employee ON department.id = employee.did WHERE department.id

NOT IN (SELECT department.id FROM department LEFT JOIN employee ON department.id = employee.did WHERE employee.name = 'Tom');

NOT IN 筛选ID的时候使用最后一个一方的ID,会更快一点。

例如:A  多对一  B  一对一  C  多对一  D  多对多  E

这个时候一直到 D 都是一方 所以 NOT IN 时使用 D 的字段筛选。即...WHERE D.COLUMN NOT IN (SELECT D.COLUMN FROM...

解决2:not in 的思想进阶

使用LEFT JOIN 代替 NOT IN。

将NOT IN 的子查询当做一个表,对其进行关联,然后筛选这个表字段为空的。

例如还是这个例子

SELECT department.id FROM department LEFT JOIN employee ON department.id = employee.did WHERE employee.name = 'Tom';

我们设这个表为 nodepartment 列为 id。结果应该只有一行一列 ‘1’。

则主表关联nodepartment后  department.id 为 2 的行 nodepartment.id这一列为null。所以主表条件 nodepartment.id IS NULL就可以了。

在这里就是:

SELECT *  FROM department LEFT JOIN employee ON department.id = employee.did

LEFT JOIN 

 (SELECT department.id AS nodepid FROM department LEFT JOIN employee ON department.id = employee.did

WHERE employee.name = 'Tom')  AS nodep ON department.id = nodep.nodepid

WHERE nodepid IS NULL;

转载于:https://www.cnblogs.com/ming-question/p/11102064.html

相关文章:

  • 浅复制和深复制
  • JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
  • SpringBoot:spring boot使用Druid和监控配置
  • linux uniq去重,awk输出(可用于爆破字典优化)
  • Linux内核简介、子系统及分类
  • [转载]浅谈JavaScript函数重载
  • 2019-7-2 作业1 2 3
  • python 基本数据类型及其功能-3-列表
  • Java虚拟机类加载机制
  • Python高效编程技巧
  • MFC:常用的消息
  • ubuntu左边栏消失
  • java表达式和三目运算符
  • Matrix: Matrix的,postScale(), postTranslate()方法
  • LeetCode--数组
  • (三)从jvm层面了解线程的启动和停止
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Apache的基本使用
  • in typeof instanceof ===这些运算符有什么作用
  • java8-模拟hadoop
  • java取消线程实例
  • Linux中的硬链接与软链接
  • Making An Indicator With Pure CSS
  • Terraform入门 - 1. 安装Terraform
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • yii2中session跨域名的问题
  • 巧用 TypeScript (一)
  • 一、python与pycharm的安装
  • 正则表达式
  • 《天龙八部3D》Unity技术方案揭秘
  • 如何用纯 CSS 创作一个货车 loader
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​力扣解法汇总946-验证栈序列
  • #pragma pack(1)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (145)光线追踪距离场柔和阴影
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (day6) 319. 灯泡开关
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)关于多人操作数据的处理策略
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net 反编译_.net反编译的相关问题
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net2005怎么读string形的xml,不是xml文件。
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Query中countQuery的介绍
  • [ 第一章] JavaScript 简史
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [android] 手机卫士黑名单功能(ListView优化)