行转列经典案例(left join)

标题或者也可改成:表自己和自己left join.

背景:最近在拆库,但是发现有个表自己和自己left join,百撕不得骑姐啊。

本章主要讨论2个点:

1、表A和表B left join,最多多少行?

2、为啥表要自己和自己left join,可不可以只用表本身解决问题。

解决方案for1:

1、研究了下,有了新的发现:表A和表B left join时,假设表A有m行,表B有n行,那么A和B left join时,行数最多是多少?是m*n行,就是笛卡尔积本身的数量,举例如下:

这是原表记录,共9条,对它进行left join运算,SQL如下:

SELECT 
*
FROM
    borrows_contact mdc1
        LEFT JOIN
    borrows_contact mdc2 ON mdc1.user_id = mdc2.user_id

得出的结果是81条,如下图所示:

解决方案for2:

我们直接找一个可用的userId,然后分别不用left join和自己left join看2个结果,就可以得出结论:

1、不用left join,查出来的结果如下:

2、left join后的结果如下

通过比较发现,不用left join的话,只是把行列出来了,数据都是分散的,但是join的话,将行转列了,非常清晰明了,当然如果不用行转列,在程序中实现也可以

---------

最后要说明的是:如果表A有10行数据,表B有4行数据,那么A和B left join时,以A为主表,B中未匹配的6行数据将以null的形式出现,此时如果加上b.id is not null时,效果同A和B的inner join.

 

 

 

 

 

转载于:https://my.oschina.net/windows20/blog/1560610

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值