sql join on 三个条件_有趣的SQL二:两个表没连接条件的JOIN

本文探讨了如何处理SQL中的JOIN操作,当没有连接条件时会出现笛卡尔积或空结果的情况。通过举例说明了两种方法的后果:无连接条件的JOIN产生重复值,而使用标量子查询可能导致错误。提出了补救措施,即人为添加1:1关系的连接条件,例如使用窗口函数row_number() over或MySQL 5.7的@自变量方法。最后鼓励读者尝试用标量子查询解决问题,并邀请对SQL优化有兴趣的人加入QQ群交流。
摘要由CSDN通过智能技术生成

文章节选自松华老师《SQL开发与优化》专栏,想阅读更多内容请扫码订阅

023031c2808f3f353e6f9e5c61614c7a.png


今天逛论坛看到了一个,奇葩需求,他想把两个表的结果连在一起显示

我把需求整理如下 :

下面有两个表 a 和 t12 数据分别如下

49834a9eaa35705096612587ebf5d811.png

现在想要的结果是 

7d5515a880cd05f52bcc38c538ef04ff.png

现在我们来分析一下,怎样满足上述需求

1,如果我们想把不同的表中的列横向展示,那肯定只有JOIN或者标量子查询

2,如果用了1的方案,那必须得有连接条件,不然会产生笛卡尔积,或者是空

先给大家展示下 2 的两种效果

第一种 JOIN 没有连接条件

acaf7647c5d7264a26c64239b1b48392.png

从上面的结果中,可以看到 有重复值,当然对这个结果,至少我们把列显示在一起了。

可以利用一些特性,是能达到我们想要的结果,这个以后有机会再延伸。

第二种,利用标量子查询

fb07cec91391d9a9480ee21096f1f6ac.png

从结果中,可以看出,一开始会报个错误,之后添加了 limit 1 之后 结果是出来了 ,但是跟我想的不一样

上面的两种方法,都可以达到列出来的效果,但是都有一些问题,现在对上面两种方法,进行补救措施,达到我们想要的结果。

第一种 join 方法

acaf7647c5d7264a26c64239b1b48392.png

从图片中,看出的问题是,没有连接条件导致,有重复值。

那么解决方案就是,找出一个连接条件,使它不出现重复值!

我经常跟我SQL优化班中的学员说,

“写SQL如同解决数学数学问题一样,最难得是添加辅助线!

这里的辅助线是什么?

答案就是:需要人为的对两个表添加一个列,保证他们的关系是1:1 就可以达到join的效果了

现在做的就是,在两边分别添加一个1,2,3,4...这样的序列,然后用这个进join 或者left join 。

现在MySQL 已经到8.0版本,为了更好的促使大家学到新知识,我在这用row_number over

窗口函数,如果你是MySQL 5.7版本,你也可以使用@ 自变量方法得到,这一点,请大家自行在网上查阅!

9c61a3d95a57bfe42fdcb9ecb0933313.png

如上图所示,结果跟我们的预期一样!!

现在还有,使用标量子查询 达到我们预期结果的问题。这个,大家可以自行写一下,一起探讨。

一个SQL如同数学题一样,也有不同的写法,达到同一个结果!

以上就是,今天的内容

谢谢大家~ 欢迎转发

我是知数堂SQL优化班老师

如有关于SQL优化方面疑问需要交流的,请加入QQ群(579036588),并

@骑龟的兔子 就可与我联系

扫码订阅《SQL开发与优化专栏,get更多SQL优化技能

023031c2808f3f353e6f9e5c61614c7a.png

END


70db4720c71bb68ef8481a3261ba8156.png

f64904243d5ed1431106f9b02c57dfbb.png

368d166fdaea1f76392450411fd0a292.gif

扫码加入MySQL技术Q群

(群号:579036588)

13c6c1c323c56f01227b4f9c617c8727.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值