MySQL 两张表数据合并的实现

作者:Dylan 时间:2024-01-28 07:25:49 

有一个需求, 需要从数据库中导出两张表的数据到同一个excel中

鉴于是临时的业务需求, 直接使用Navicat 进行查询并导出数据.

数据涉及到三张表

CREATE TABLE `bigdata_qiye` (
 `id` bigint(64) NOT NULL COMMENT '主键',
 `tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
 `registration_type` int(2) DEFAULT NULL COMMENT '注册类型(1.国有,2.民营,3.外资)',
 PRIMARY KEY (`id`) USING BTREE,
 KEY `bigdata_qiye_tenant_id` (`tenant_id`) USING BTREE,
 KEY `bigdata_qiye_id` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='申报企业表';
CREATE TABLE `bigdata_qiye_report` (
 `id` bigint(64) NOT NULL COMMENT '主键',
 `tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
 `qiye_id` bigint(64) DEFAULT '0' COMMENT '企业扩展信息',
 `revenue` double(16,2) DEFAULT NULL COMMENT '营收',
 PRIMARY KEY (`id`) USING BTREE,
 KEY `bqr_qiye_id` (`qiye_id`) USING BTREE,
 KEY `bgr_tenant_id` (`tenant_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='企业申报信息表';
CREATE TABLE `bigdata_tech_improve_impl` (
 `id` bigint(64) unsigned zerofill NOT NULL COMMENT '主键',
 `tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
 `qiye_id` bigint(64) DEFAULT '0' COMMENT '企业扩展信息',
 `total_input` decimal(64,2) DEFAULT NULL COMMENT '总投资',
 PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='技改项目实施情况表';

需要合并导出 bigdata_qiye_report 表与 bigdata_tech_improve_impl 表的数据

表 bigdata_qiye 与表 bigdata_qiye_report 是 一对多的关系
表 bigdata_qiye 与表 bigdata_tech_improve_impl 也是 一对多的关系
表 bigdata_qiye_report 与表 bigdata_tech_improve_impl 没有关联关系

希望导出的excel格式

MySQL 两张表数据合并的实现

所以, 如果用链接查询的话产生的结果会偏差
比如这样

select bq.registration_type ,
bqr.revenue,
btii.total_input
from bigdata_qiye bq
left join bigdata_qiye_report bqr
on bqr.qiye_id = bq.id
left join bigdata_tech_improve_impl btii
on btii.qiye_id = bq.id

MySQL 两张表数据合并的实现

会产生许多的重复数据 .

解决方法
使用 union(对结果集去重) 或者 union all(不去重) 关键字 将两个 select 语句的结果作为一个整体显示出来

第一个sql

select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
bqr.revenue as '营收'
from bigdata_qiye bq
left join bigdata_qiye_report bqr
on bqr.qiye_id = bq.id

第二个sql

select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
btii.total_input as '总资产'
from bigdata_qiye bq
left join bigdata_tech_improve_impl btii
on btii.qiye_id = bq.id

合并 SQL


(select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
bqr.revenue as '营收'
from bigdata_qiye bq
left join bigdata_qiye_report bqr
on bqr.qiye_id = bq.id)

union all

(select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型'
btii.total_input as '总资产'
from bigdata_qiye bq
left join bigdata_tech_improve_impl btii
on btii.qiye_id = bq.id)

执行, 报错
原因: 使用 union 关键字时, 必须要保证两张表的字段一模一样(包括顺序)
所以 修改sql
sql _1 修改

select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
bqr.revenue as '营收',
'' as '总资产'
from bigdata_qiye bq
left join bigdata_qiye_report bqr
on bqr.qiye_id = bq.id

sql_2修改

select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
'' as '营收',
btii.total_input as '总资产'
from bigdata_qiye bq
left join bigdata_tech_improve_impl btii
on btii.qiye_id = bq.id

合并SQL


(select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
bqr.revenue as '营收',
'' as '总资产'
from bigdata_qiye bq
left join bigdata_qiye_report bqr
on bqr.qiye_id = bq.id)

union all

(select
case
bq.registration_type
when 1 then '国有'
when 2 then '民营'
when 3 then '外资'
else ''
end as '注册类型',
'' as '营收',
btii.total_input as '总资产'
from bigdata_qiye bq
left join bigdata_tech_improve_impl btii
on btii.qiye_id = bq.id)

查询结果

MySQL 两张表数据合并的实现

来源:https://blog.csdn.net/weixin_44931584/article/details/127211386

标签:MySQL,数据合并
0
投稿

猜你喜欢

  • JavaScript设计模式之原型模式分析【ES5与ES6】

    2024-05-02 16:29:37
  • Pytorch使用MNIST数据集实现基础GAN和DCGAN详解

    2021-11-17 02:14:33
  • 高效的mysql分页方法及原理

    2024-01-20 04:23:46
  • JS 显示当前日期+星期(静态)

    2007-09-11 13:29:00
  • 在Django的通用视图中处理Context的方法

    2023-02-25 20:50:45
  • 图片滤镜效果[IE Only]

    2009-06-14 19:49:00
  • 按日期打印Python的Tornado框架中的日志的方法

    2023-09-29 12:28:13
  • python 解压pkl文件的方法

    2022-01-11 02:41:55
  • windows 下python+numpy安装实用教程

    2022-06-26 09:52:26
  • 网站登录持久化Cookie方案

    2023-07-01 01:44:17
  • python实现带验证码网站的自动登陆实现代码

    2021-08-08 19:44:46
  • Python使用三种方法实现PCA算法

    2022-06-26 13:32:49
  • Python详细介绍模型封装部署流程

    2023-03-27 00:49:32
  • SQL Server中的XML数据类型详解

    2024-01-15 20:56:44
  • Python如何把不同类型数据的json序列化

    2021-06-01 22:52:16
  • 跟混乱的页面弹窗说再见

    2024-06-07 16:02:05
  • Python K-means实现简单图像聚类的示例代码

    2023-06-30 10:40:58
  • Python使用random.shuffle()随机打乱字典排序

    2021-05-02 03:12:01
  • Django 限制访问频率的思路详解

    2021-08-17 16:52:57
  • Python数据结构之递归方法详解

    2021-05-11 09:10:37
  • asp之家 网络编程 m.aspxhome.com