mysql left join 去重_SQL LEFT JOIN 数据去重复
SQL LEFT JOIN 数据去重复
2020-11-05 05:15:38.0
实例:查询当前用户参与过的流程实例(instance)
关系:每个实例 (instance)对应多个任务(task),task关联办理人(userId)
select inst.*
from instance inst
left join task t on inst.id = t.inst_id
where t.user_id = #{userId}
这样查询后,如果一个人办理同一个流程中的多个任务,则会重复查出相同的instance。
其实 join 关键词查询“一对多”关系的数据,查询之后的结果的记录数,是和“ 多端 ”保持一致的,也就是“一端”的数据会重复。
left join、right join 只是选择保留下左/右端不符合join条件的多余数据,与数据重复问题无关,inner join 、outter join 也是。 所以数据的数据去重复,无法通过这几个关键词解决。
实例分析解决
有用户与角色的“一对多”,left join查询如下:
-- LEFT JOIN 查询一对多的关系,“一端”会重复
SELECT
u.id,
u.mc,
u.nl,
u.lxfs,
u.bzsm,
r.id roleId,
r.jsmc,
r.sm
FROM
test_user u
LEFT JOIN test_role r ON u.id = r.user_id
解决方法一: 结果使用group by 去重
将查询结果作为中间表,使用group by 进行去重:
-- 关联查询出结果,再使用group by 去重
select tmp.* from (
SELECT
u.id,
u.mc,
u.nl,
u.lxfs,
u.bzsm,
r.id roleId,
r.jsmc,
r.sm
FROM
test_user u
LEFT JOIN test_role r ON u.id = r.user_id
) tmp group by tmp.id;
解决方法二: “多端”使用group by 去重
去重“多端”的数据(中间表变成一对一),再关联。分析重复的原因,就是就是有多个角色对应同一个user_id,所以,将角色去重,变成“一对一”关系,再关联查询。
-- 去重“多端”的数据(中间表变成一对一),再关联
SELECT
u.id,
u.mc,
u.nl,
u.lxfs,
u.bzsm,
tmp_r.id roleId,
tmp_r.jsmc,
tmp_r.sm
FROM
test_user u
LEFT JOIN (
select r.* from test_role r group by r.user_id
) tmp_r ON u.id = tmp_r.user_id
解决方法三:使用 EXISTS
上述两种方法,其实对“多端”保留哪条数据是没有要求的(除非自己再重新定义test_role的去重方法),所以,与exists的查询效果相同。
尤其在开篇的实例中,“ 查询当前用户参与过的流程实例(instance) ”,即与参与哪个task无关时,使用exists更符合业务逻辑。
-- exists
SELECT u.*
FROM
test_user u
WHERE EXISTS (
select * from test_role r where r.user_id = u.id
);
2020-11-05 05:15:38.0
mysql left join 去重_SQL LEFT JOIN 数据去重复相关推荐
- oracle 查的数据去重复数据,Oracle查询和过滤重复数据
对数据库某些意外情况,引起的重复数据,如何处理呢? ----------------查重复: select * from satisfaction_survey s where s.as_side = ...
- SQL数据去重复 Distinct 和 row_number() over()
Distinct:查询结果中,去掉了重复的行 1.语法: SELECT Distinct列名称 FROM 表名称; Distinct 必须放在Select搜索字段的最前面,否则SQ ...
- sql join 示例_SQL CROSS JOIN与示例
sql join 示例 In this article, we will learn the SQL CROSS JOIN concept and support our learnings with ...
- execl筛选去重_Excel中表格筛选去重复项的操作方法
一听去重复项,大家可能都熟悉,因为现在的office版本比较高起码都是2007的吧,去重复项一键就能完成.但是小编现在要做的不是去除而是筛选,这又如何操作呢?今天,学习啦小编就教大家在Excel中表格 ...
- 数据去重复_字典应用实例(每行每列都要去重复值)
我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务.支持我,也为自己加油! 前面两节课中的去重复,不论是单张表里的去重复还是多张表里的去重 ...
- mysql 随机记录 newid()_sql随机查询数据语句(NewID(),Rnd,Rand(),random())
在不同的sql数据库服务器对于随机抽取数据的方法不同,下在我们介绍mysql, msssql, access, postgreSQL 中随机查询数据的方法. 1.SQL SERVER:SELECT T ...
- java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000
我有一个Spark应用程序将RDD数据写入MongoDB,我得到一个MongoBulkWriteException.以前,我使用MongoDB标准驱动程序中的bulkWrite()方法,但我已经开始使 ...
- DataTable 数据去重复
ds.Tables[0].DefaultView.ToTable("q", true, "errorZone"); 第二个参数"True" ...
- List集合中数据用set集合去重复,用set集合去重复数据重写了equals还是没成功!
[用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后] 需求描述: 因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集 ...
最新文章
- Android 定制RadioButton样式
- npm run dev 出现npm ERR!missing scrip:dev
- Xstudio+Bugzilla
- lyapunov指数 matlab计算_Matlab学习笔记1——B站台大课
- 比特币、莱特币来一发?
- 如何在linux程序中捕获异常信号
- laravel-admin 在指定的相册下添加照片
- 来谈谈Spring构造函数注入的循环依赖问题
- 分页查询超时问题(1)
- python迷你停车场管理系统_python实现停车管理系统
- asmack xmpp应用遇到的问题
- 如何卸载CrossOver里的软件 ?快来看看吧
- 漫画:Bitmap算法
- 怎么在服务器上运行sql文件,数据库执行sql文件
- python百度文库免券下载
- 使用扫码枪(二维码,条码)使用键盘钩子获取扫码数据
- 槐香拂过,你如期而至
- GDAL python教程基础篇(4)OGR拷贝方法
- [Error]cannot convert 'float'tot float for argument 1to floa
- 教程-OBS刷课(岗位证)