SQL 实现横向连接

SQL实现横向连接主要是通过建立临时表(中间过渡作用,暂时存放查询结果),然后再从临时表进行其他操作。

首先介绍一下联合查询(join…on)和 union 的局限性:
1.union:是将两个结果集竖向连接,需要保证两个结果集列数相等,用法网上很多,就不写了
2.join…on:join…on其实不是拼接,而是将某字段转化成另一个表示方式,比如,1代表无,2代表有。
举个例子说明一下:下面有两张表 test1 和test2;
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019110420574930.png
1代表无,2代表有。
在这里插入图片描述
如果想查看每个人是否某一样东西,很简单 :
select a.Name,a.书本,b.ifhave from test1 as a join test2 as b on a.书本=b.ID;结果如下:
在这里插入图片描述
select a.Name,a.书包,b.ifhave from test1 as a join test2 as b on a.书包=b.ID;
在这里插入图片描述
select a.Name,a.铅笔,b.ifhave from test1 as a join test2 as b on a.铅笔=b.ID;
在这里插入图片描述
注意这里,当有多个表联合查询的时候尽量给表起别名,因为如果两张表有相同的字段,通过别名就可以排除误导。

但如果是想同时查看是否有书本,书包和铅笔三样东西,也就是要把上面三个表的内容结合起来,单个的join…on 就实现不了(只能实现一次转化),这时就得建立临时表实现横向连接。
如下:
select a.Name,a.书本,b.书包,c.铅笔 from(
(select test1.Name as Name,test2.ifhave as 书本 from test1 join test2 on test1.书本=test2.ID) a
join (select test1.Name as Name,test2.ifhave as 书包 from test1 join test2 on test1.书包=test2.ID) b
join (select test1.Name as Name,test2.ifhave as 铅笔 from test1 join test2 on test1.铅笔=test2.ID) c)
where ((a.Name=b.Name) and (a.Name=c.Name)); (这里示范了多张表有相同字段名时的用法)
在这里插入图片描述
这里建了三个临时表 a,b,c(主要是因为SQL 支持嵌套使用,可以对之前的结果集继续操作),通过 join 连接三张表,这样就实现了横向连接。(最后的where条件不能省,不然会出现笛卡儿积现象)

其中,a表内容如下:
select test1.Name as Name,test2.ifhave as 书本 from test1 join test2 on test1.书本=test2.ID;在这里插入图片描述
b表内容如下:
select test1.Name as Name,test2.ifhave as 书包 from test1 join test2 on test1.书包=test2.ID;在这里插入图片描述
c表内容如下:
select test1.Name as Name,test2.ifhave as 铅笔 from test1 join test2 on test1.铅笔=test2.ID;在这里插入图片描述
也就是将a、b、c三张表的第二列横向连接到一个表里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值