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 数据去重复相关推荐

  1. oracle 查的数据去重复数据,Oracle查询和过滤重复数据

    对数据库某些意外情况,引起的重复数据,如何处理呢? ----------------查重复: select * from satisfaction_survey s where s.as_side = ...

  2. SQL数据去重复 Distinct 和 row_number() over()

    Distinct:查询结果中,去掉了重复的行 1.语法:      SELECT Distinct列名称 FROM 表名称;      Distinct 必须放在Select搜索字段的最前面,否则SQ ...

  3. sql join 示例_SQL CROSS JOIN与示例

    sql join 示例 In this article, we will learn the SQL CROSS JOIN concept and support our learnings with ...

  4. execl筛选去重_Excel中表格筛选去重复项的操作方法

    一听去重复项,大家可能都熟悉,因为现在的office版本比较高起码都是2007的吧,去重复项一键就能完成.但是小编现在要做的不是去除而是筛选,这又如何操作呢?今天,学习啦小编就教大家在Excel中表格 ...

  5. 数据去重复_字典应用实例(每行每列都要去重复值)

    我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务.支持我,也为自己加油! 前面两节课中的去重复,不论是单张表里的去重复还是多张表里的去重 ...

  6. mysql 随机记录 newid()_sql随机查询数据语句(NewID(),Rnd,Rand(),random())

    在不同的sql数据库服务器对于随机抽取数据的方法不同,下在我们介绍mysql, msssql, access, postgreSQL 中随机查询数据的方法. 1.SQL SERVER:SELECT T ...

  7. java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000

    我有一个Spark应用程序将RDD数据写入MongoDB,我得到一个MongoBulkWriteException.以前,我使用MongoDB标准驱动程序中的bulkWrite()方法,但我已经开始使 ...

  8. DataTable 数据去重复

    ds.Tables[0].DefaultView.ToTable("q", true, "errorZone"); 第二个参数"True"  ...

  9. List集合中数据用set集合去重复,用set集合去重复数据重写了equals还是没成功!

    [用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后] 需求描述: 因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集 ...

最新文章

  1. Android 定制RadioButton样式
  2. npm run dev 出现npm ERR!missing scrip:dev
  3. Xstudio+Bugzilla
  4. lyapunov指数 matlab计算_Matlab学习笔记1——B站台大课
  5. 比特币、莱特币来一发?
  6. 如何在linux程序中捕获异常信号
  7. laravel-admin 在指定的相册下添加照片
  8. 来谈谈Spring构造函数注入的循环依赖问题
  9. 分页查询超时问题(1)
  10. python迷你停车场管理系统_python实现停车管理系统
  11. asmack xmpp应用遇到的问题
  12. 如何卸载CrossOver里的软件 ?快来看看吧
  13. 漫画:Bitmap算法
  14. 怎么在服务器上运行sql文件,数据库执行sql文件
  15. python百度文库免券下载
  16. 使用扫码枪(二维码,条码)使用键盘钩子获取扫码数据
  17. 槐香拂过,你如期而至
  18. GDAL python教程基础篇(4)OGR拷贝方法
  19. [Error]cannot convert 'float'tot float for argument 1to floa
  20. 教程-OBS刷课(岗位证)

热门文章

  1. FPGA串口回环实验
  2. 基于webpack修改插件源码,使用自定义文件替换node_modules里面的源码文件
  3. OGEngine介绍
  4. Skewed Data
  5. implode 和explode 的区别用法
  6. 正在运行的dll文件怎么删除?
  7. 删除cookie,domain的设置
  8. 全球及中国麦克风电源行业市场发展趋势与投资战略规划研究报告2022-2028年
  9. 【Centos7内网环境Nexus3私服搭建】
  10. 吴恩达机器学习ex3多类别分类