sql将多个查询结果左右横向拼接

发布时间 2023-05-17 14:50:45作者: 草帽小子路飞

今天写springboot接口的时候遇到一个需求:查询多张表计算这些表的条数,然后将这些数据封装到一个对象中,这些表并没有相同的字段或其它的关联关系。这个问题咋一看觉得很简单,但实现起来却有点麻烦。

如果我们现在有两张表要装入模型对象

user表:

po_id name age
1 路飞 19
2 艾斯 null
3 萨博 21

fruit表:

num melon price
56452666 apple 120
26161616 orange 50
45816126 null 200
46164691 watermelon 40
public class MarketInfo {

    @ApiModelProperty("人员数量")
    private String companySum;

    @ApiModelProperty("水果数量")
    private String personSum;
}

单个表的数据我们是能一一查出来的,但是如果一个一个查的话,在Dao层我们就需要写多个dao的接口,例如上面这个,如果是有两张表的话就需要用两个dao层接口,这样操作很麻烦,那么有没有简单的方法呢?

因为这些属性各对应一张表的统计数据,首先我们可能会想到连表查询,由于各个表之间没有相关联的字段因此,连表查询的条件无法满足,所以无论是内连接还是外连接都是行不通的。

也有人可能会想到用union对查询结果进行合并,但是union是对查询结果进行纵向上下合并而不是横向合并,请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

如果我们这样写:

select count(*) A from user
union all
select count(*) B from fruit;

那么我们得到的结果将会是

查询的结果被合并成一列并且后面的字段名还没覆盖了

那么到底应该怎样写才能得到我们想要的结果呢?答案是使用子查询和联表查询相结合

select * from 
(select 1 id,count(*) A from user) X
left join
(select 1 id,count(*) B from fruit) Y
on X.id=Y.id

结果:

这里我们人为地为查询结果中添加一个id字段并且给这两个表的值都相同,这样我们就能够根据这个id字段进行连表查询了。

如果不行看到这个id,那么可以查那两个指定字段:

select A,B from 
(select 1 id,count(*) A from user) X
left join
(select 1 id,count(*) B from fruit) Y
on X.id=Y.id

这样就完美地实现我们想要的效果了。
这个方法需要注意一点就是我们所查询到的结果行数一定要相等。