SQL实现横向连接主要是通过建立临时表(中间过渡作用,暂时存放查询结果),然后再从临时表进行其他操作。
首先介绍一下联合查询(join…on)和 union 的局限性:
1.union:是将两个结果集竖向连接,需要保证两个结果集列数相等,用法网上很多,就不写了
2.join…on:join…on其实不是拼接,而是将某字段转化成另一个表示方式,比如,1代表无,2代表有。
举个例子说明一下:下面有两张表 test1 和test2;

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三张表的第二列横向连接到一个表里面。
2090

被折叠的 条评论
为什么被折叠?



