MySQL 两张表数据合并的实现

有一个需求, 需要从数据库中导出两张表的数据到同一个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格式

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

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

会产生许多的重复数据 .

解决方法
使用 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 两张表数据合并的实现的文章就介绍到这了,更多相关MySQL 数据合并内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MYSQL使用Union将两张表的数据合并显示

    使用UNION操作符 union:用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中.多个 SELECT 语句会删除重复的数据. 使用union操作符会将多张表中相同的数据取值一次,如果想将表1和表2中的值完整的显示出来,可以使用union all. 演示 小伙伴们自行创建一下表. 表1数据如下: 表2数据如下: OK,表数据已经创建完成,一共五条数据,接下来我们去看一看union 和 union all 的使用. 使用union 看一下效果: select t1.id id, t

  • mysql如何将多行数据合并成一行

    select group_concat(list_name) from aa_list

  • MySQL 两张表数据合并的实现

    有一个需求, 需要从数据库中导出两张表的数据到同一个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

  • MySQL实现两张表数据的同步

    mysql通过触发器实现两个表的同步,需要了解的朋友可以看一下. 有两张表A和B,要求往A里面插入一条记录的同时要向B里面也插入一条记录,向B里面插入一条记录的同时也向A插入一条记录.两张表的结构不同,需要将其中几个字段对应起来.可以用下面的触发器实现. 表A的触发器: begin set @disable=1; if @disable=1 and NOT EXISTS(SELECT 1 FROM tableB where ID=new.ID) then insert into tableB (

  • MySQL如何实现两张表取差集

    目录 MySQL两张表取差集 求差集 SQL 脚本 MySQL查两个表之间的数据差集 SQL LEFT JOIN 关键字 总结 MySQL两张表取差集 业务场景如下: 人员表中有证件号.手机号字段,这两个字段因为涉及到个人隐私问题,因此加密存储,有另外一张解密表可以和人员表进行关联,查出解密后的证件号和手机号,现在需要统计出人员表中有多少没有加密的数据,进行再次加密处理,这个时候,考虑到的就是求两张表的差集,来找出未加密的人员. 求差集 SQL 脚本 select p.* from person

  • mysql关联两张表时的编码问题及解决办法

    Mysql关联两张表时,产生错误提示Illegal mix of collations 1.先用工具把数据库.两张表的编码方式改变 2.这步很重要,需要改变字段的编码方式. ALTER TABLE `表名` CHANGE `dev_chancode` `字段` VARCHAR(32) CHARACTER SET gbk NOT NULL; 总结:在建表时一定注意统一的编码方式,后续搞来搞去超级麻烦. 如何解决MySQL表编码转换问题 将待导出的数据表的表结构导出(可以用Phpmyadmin.my

  • Oracle两张表关联批量更新其中一张表的数据

    方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXISTS (SELECT 1 FROM 表1 WHERE 表1.A = 表2.A); 尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围. 方法二: MERGE INTO 表2 USING 表1 ON (表2.A = 表1.A) -- 条件是 A 相同 WHEN MATCHED THEN UPDATE SET 表2.C = 表1.

  • 数据库中两张表之间的数据同步增加、删除与更新实现思路

    分别创建增加.删除.更新的触发器(Trigger)来达到两张表之间数据同步的目的. 1:数据同步增加: 如有两张表--A表和B表,创建触发器使当A表插入数据后B表也同步插入数据.其中B表插入数据的字段需要同A表中的字段相对应. 复制代码 代码如下: CREATE TRIGGER 触发器名称 ON A表 AFTER INSERT AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3) SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED END

  • 浅谈mysql一张表到底能存多少数据

    程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB.同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB.(确切的说是InnoDB数据页大小16KB).详细学习可以参考官网我们可以用如下命令查询到. mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_s

  • 面试提问mysql一张表到底能存多少数据

    目录 前言 1.知识准备 1.1.数据页 1.2.索引结构(innodb) 2.具体计算方法 2.1.根节点计算 2.2.其余层节点计算 3.总结 前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 1.知识准备 1.1.数据页 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB.同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB.(确切的说是Inn

  • php+mysqli批量查询多张表数据的方法

    本文实例讲述了php+mysqli批量查询多张表数据的方法.分享给大家供大家参考.具体实现方法如下: 注意这里使用到了两个新的函数multi_query与store_result,具体代码如下: 复制代码 代码如下: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","123456","liuyan"); if($mysqli->connect_

随机推荐