多张表中数据组合后插入新表的方法

以mysql为例。

遇到这个问题的时候最先想到的方法就是先从各个表中查询出相应的数据后使用程序循环遍历组装后在插入到数据库中。这是最直观的解决办法,但是这个方法处理超大结果集的时候就出现问题,例如:超出内存限制,运行时间过长等等。。。

这时使用另外一种方法应该会有帮助,那就是使用mysql的on duplicate key update方法来分步骤组合数据。

现在有3张表a,b,c。每个表的结构如下:

a表包含字段:id,a,b,c;

b表包含字段:aID,d,e,f;字段aID对应表a中的id

c表包含字段:aID,a,b,c,d,e,f;字段aID对应表a中的id

现在要把a表和b表中的数据组合后插入到c表中,其中a和b均包含1000W+的数据,如果采用查询-》组装-》插入数据库的方式,在查询步骤和组装步骤均会超出内存限制。

这是可以采用如下步骤:

  1. 从a中查询出符合条件的数据后插入到c中。例如:

    INSERT INTO c (c.aID,c.a,c.b,c.c) SELECT a.id,a.a,a.b,a.c FROM a WHERE a.id<5000000

    执行完成大约用时40秒

  2. 从b表中查询出符合条件的数据后插入到c中。例如:

    INSERT INTO c (c.aID,c.d,c.e,c.f) SELECT b.aID,b.d,b.e,b.f FROM b WHERE b.aID<5000000 ON duplicate KEY UPDATE c.d=VALUES(c.d),c.e=VALUES(c.e),c.f=VALUES(c.f)

    执行完成大约用时50多秒

这样就把a和b中的数据组合插入到了c中。

时间: 2024-12-11 07:04:40

多张表中数据组合后插入新表的方法的相关文章

MySQL查询数据表中数据记录(包括多表查询)

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

mysql--对行(表中数据)的增删改查

一.插入数据(增加)insert 1.插入数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); #指定字段来插入数据,插入的值要和你前面的字段相匹配 语法二: INSERT INTO 表名 VALUES (值1,值2,值3-值n); #不指定字段的话,就按照默认的几个字段来插入数据 2.指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3-) VALUES (值1,值2,值3-); 3.插入

修改表中数据的两种方法(update改)

1.通过点击按钮来执行修改表中数据.(数据库和表的创建不在详细介绍,请自动阅读数据库和表的创建) 第一种方法:直接使用SQL来操作数据库,调用execSQL(sql)语句 public class MainActivity extends AppCompatActivity { private Button mPudateButton; private MySqliteHelper mMySqliteHelper; private SQLiteDatabase db; @Override pro

删除表中数据的两种方法(delete删)

1.通过点击按钮来执行删除表中数据.(数据库和表的创建不在详细介绍,请自动阅读数据库和表的创建) 第一种方法:直接使用SQL来操作数据库,调用execSQL(sql)语句 public class MainActivity extends AppCompatActivity { private Button mDeleteButton; private MySqliteHelper mMySqliteHelper; private SQLiteDatabase db; @Override pro

修改表中数据

修改表中数据格式:update+表名+set+列名='表达式'+where 条件表达式update student set name='李四' where name ='43'删除表中数据格式:delete + from + 表名 +where 条件表达式说明:当选项缺省时,删除表中所有数据delete from student where csrq='1998-1-1'或者:格式:truncate +table +表名功能:删除表中所有数据删除表:drop table 删除表定义及该表的所有数

mssql字符串分割后的值,把表中不存在的插入表中

字符串分割后的值,把表中不存在的插入表中 --供大家参考 使用场景,自行思考…… --创建表tb1 Create table tb1 ( cola int, colb varchar(50) ) --插入数据 insert into tb1(cola,colb) select 1, 'A' union all select 2, 'B' union all select 3, 'C'; --存储过程 Create proc sp_tbTest @sid int,--ID @str varchar

SqlServer将表中数据复制到另一张表

insert into phone2(ph,attr,type,carrier) select top 1000 ph,attr,type,carrier from phone 将表phone的字段和前1000条数据复制到Phone2表 数据库中的某个表删除重复数据(phone2表不能存在) select distinct  * into phone2 from phone 表phone的数据放到phone2中(phone2表可以存在) insert into phone2(ph,attr,ty

Sqoop1.4.4将MySQL数据库表中数据导入到HBase表中

问题导读:         1.--hbase-table.--hbase-row-key.--column-family及--hbase-create-table参数的作用? 2.Sqoop将关系型数据库表中数据导入HBase中,默认Rowkey是什么? 3.如果关系型数据库表中存在多关键字,该怎么办? 一.简介及部分重要参数介绍 Sqoop除了能够将数据从关系型数据库导入到HDFS和Hive中,还能够导入到HBase表中. --hbase-table:通过指定--hbase-table参数值

我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令

一.如果数据重要,请先备份数据 二.删除表中数据 SQL: Delete From ('表名')  如:Delete From abcd 三.执行新语句 SQL: dbcc checkident('表名',reseed,0) 如:dbcc checkident('abcd',reseed,0) 注: { DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 检查指定表的当前标识值,如有必要,还对标识值进行更正. } 这样操作后,新插入的