SQL JOIN 理解

最近做项目开始用mybatis,就又回到了编写sql的年代,本就不熟悉sql,头疼的 各种join到今天才算有点感悟,写写自己第一篇文章 祭奠 菜鸟的我...

首先是表结构,一张违规表,一张违规责任人表,违规表主键违规信息编号,责任人表主键违规信息编号,责任人编号
也就是一对多的关系,这时候会发现无论是 inner/left/right join 数据都会变多....结果集中违规信息编号会重复,我的理解是:left 会以左表中的数据区遍历右表,有表中的数据满足 on 后面的条件,它就会把数据插入到结果集中,此时因为一条违规记录如对应多个违规人时,以左边记录遍历就会找到多条结果,所以会出现多条违规记录,导致数据增多,right,inner join 结果类似.   所以得出的结论是 一对多关系时,若要以主表为准统计记录数是不能用join, 若用必须去除重复数据
刚开始不懂如何去除重复,只知道distinct关键字可以,但不知道为什么写了一直报错,后来小组一人给了一解决方案,代码如下:
select * from
(select row_number() over(partition by t.vi_code) r,t.* from
( 主体查询数据  

) t) vi where r=1
刚开始因为项目比较急,没有怎么看,只是觉得应该是用partition 分组之后,最后再取第一条数据,这样就去除了重复.....
昨天细看后也的确是这样的,以vi_code分组后,row_number()  会以组的形式显示1,23,12,.....所以当我加条件 r = 1是就只取到了各组的第一条数据...
刚才经过试验,如果给定了员工号,数据还是可以过滤的,因为一条违规记录,一个责任人只能被添加一次,所以给定责任人编号后基本就又成为了一对一关系,此时 三个join 结果也都一样,但是要查机构违规记录的话,一个机构下会有多个员工,此时再用join ,就无法过滤数据了
当人有别人的办法,有觉得不妥的解决方案,肯定会有更好的出现,只是时间问题,下面给出个人昨天研究的方案,虽然想想很简单...但对sql不好的我,还是小小突破吧
关键字: distinct ;
冷静下来想,最后结果不就是违规记录编号重复么,如果把这个字段distinct不就好了么,于是写了很多条语句
select *,distinct(code)from(主体数据), 感觉是对了吧,结果各种改测试.sql语法错误....各种无奈,最后偶然间写成了 select distinct(code),* from().....成功了!!原来distinct要写在语句的最前面....这样就去掉了以前以code分组查询rownumber()再分组视图查询的繁琐...
最后说先普通join的功能吧
left join  : 以左表为主表检索右表,若有匹配结果,插入结果集,若无也在也过集中插入数据,只不过属于右表的字段全部为null,也就是结果集中数据数至少为左表数据数,(一对多时)大于
right join : 右连接和左连接原理一样,只不过主表为右表,结果集数据各种至少为右表数据条数...
inner join : 只取两个表相关联的数据,也就是只有符合了on 后条件的数据才会被查询出来,结果集数据条数动态变化和左右表数据条数没什么关联,另一种绕口令应该是只要是满足on后条件的数据都会被显示出来,条数也与左右表无关,(一对多关系时一定要注意)此时会出现主表主键重复的情况
好了就写这里吧,以上见解纯属个人体会,如有不到之处还请指点...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值