社区首页 >问答首页 >动态SQL :为具有关系的表创建插入查询

动态SQL :为具有关系的表创建插入查询
EN

Stack Overflow用户
提问于 2019-11-21 06:52:58
回答 1查看 402关注 0票数 4

我有两张桌子,foobarbar持有foo的外键,如:

foo

代码语言:javascript
代码运行次数:0
复制
id | some_data
-: | :--------
 1 | a
 2 | b
 3 | c

bar

代码语言:javascript
代码运行次数:0
复制
id | id_foo | more_data
-: | -----: | :--------
 1 |      1 | d
 2 |      1 | e
 3 |      2 | f
 4 |      3 | g
 5 |      3 | h
 6 |      3 | i

我想动态地创建查询,以便插入到其他地方,foobar

对于表foo,很容易做到:

代码语言:javascript
代码运行次数:0
复制
SELECT CONCAT('INSERT INTO new_foo (some_data) VALUES (''', f.some_data, ''');') AS 'sql'
FROM foo f;

我得到了预期的结果:

代码语言:javascript
代码运行次数:0
复制
INSERT INTO new_foo (some_data) VALUES ('a');
INSERT INTO new_foo (some_data) VALUES ('b');
INSERT INTO new_foo (some_data) VALUES ('c');

但是,我不得不为保存外键的表生成insert查询。

我认为使用两个UNION,一个获得最后一个插入的id,另一个使用这个id为bar生成查询:

代码语言:javascript
代码运行次数:0
复制
SELECT sql
FROM
(
    SELECT f.id AS 'id', CONCAT('INSERT INTO new_foo (some_data) VALUES (''', f.some_data, ''');') AS 'sql'
    FROM foo f
    UNION
    SELECT f.id AS 'id', 'SET @last_id = SELECT LAST_INSERT_ID();' AS 'sql' -- Target will be MySQL
    FROM foo f
    UNION
    SELECT b.id_foo AS 'id', CONCAT('INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, ''', b.more_data, ''');') AS 'sql'
    FROM bar b
) s
ORDER BY s.id;

这给了我输出:

代码语言:javascript
代码运行次数:0
复制
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'd');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'e');
INSERT INTO new_foo (some_data) VALUES ('a');
SET @last_id = SELECT LAST_INSERT_ID();
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'f');
INSERT INTO new_foo (some_data) VALUES ('b');
SET @last_id = SELECT LAST_INSERT_ID();
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'g');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'h');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'i');
INSERT INTO new_foo (some_data) VALUES ('c');
SET @last_id = SELECT LAST_INSERT_ID();

查询的顺序是错误的。它首先生成对bar的查询,然后生成foo,然后生成LAST_INSERT_ID()

它应该是:

代码语言:javascript
代码运行次数:0
复制
INSERT INTO new_foo (some_data) VALUES ('a');
SET @last_id = SELECT LAST_INSERT_ID();
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'd');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'e');
INSERT INTO new_foo (some_data) VALUES ('b');
SET @last_id = SELECT LAST_INSERT_ID();
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'f');
INSERT INTO new_foo (some_data) VALUES ('c');
SET @last_id = SELECT LAST_INSERT_ID();
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'g');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'h');
INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, 'i');

如何确保正确的秩序得到尊重?我可以在UNION中处理每个查询的位置,但我不确定条目的顺序是否会被保留。

下面是一个可以使用的小提琴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 07:02:47

您有三行具有相同的id,并且没有指定顺序。您只需添加一个新列来指定顺序:

代码语言:javascript
代码运行次数:0
复制
SELECT sql
FROM
(
    SELECT f.id AS 'id', -1 AS seq, CONCAT('INSERT INTO new_foo (some_data) VALUES (''', f.some_data, ''');') AS 'sql'
    FROM foo f
    UNION
    SELECT f.id AS 'id', 0 AS seq, 'SET @last_id = SELECT LAST_INSERT_ID();' AS 'sql' -- Target will be MySQL
    FROM foo f
    UNION
    SELECT b.id_foo AS 'id', b.id AS seq, CONCAT('INSERT INTO new_bar (id_foo, more_data) VALUES (@last_id, ''', b.more_data, ''');') AS 'sql'
    FROM bar b
) s
ORDER BY s.id, s.seq;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58977720

复制
相关文章
JAVA动态创建表以及动态插入数据
利用JDBC驱动链接Mysql数据其实很简单的,第一要下载一个名为 “mysql-connector-java-5.1.20-bin.jar” 驱动包。并解压到相应的目录!5.1.20是版 本号到目前为止这个是最新的版本!
ZONGLYN
2019/08/08
6.6K0
mysql创建临时表,将查询结果插入已有表中
        今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取。我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些。然后还需要将查询的结果存储到临时表中。下面是创建临时表以及插入数据的例子,以供大家参考。 A、临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表: 1)定义字段   CREATE TEMPORARY TABLE tmp_table (       name VAR
苦咖啡
2018/05/07
9.9K0
SQL表之间的关系
要在表之间强制执行引用完整性,可以定义外键。修改包含外键约束的表时,将检查外键约束。
用户7741497
2022/06/06
2.5K0
使用Hive SQL插入动态分区的Parquet表OOM异常分析
当运行“INSERT ... SELECT”语句向Parquet或者ORC格式的表中插入数据时,如果启用了动态分区,你可能会碰到以下错误,而导致作业无法正常执行。
Fayson
2018/03/30
6.5K0
SQL语句中创建表的语句_用sql创建表
连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)
全栈程序员站长
2022/11/03
4.7K0
SQL语句中创建表的语句_用sql创建表
1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表
本文介绍了SQL Server 2008中创建具有约束条件的表的方法。文章首先介绍了约束条件的六种类型,然后通过实例演示了如何使用这些约束条件来确保数据的完整性和唯一性。最后,文章介绍了如何创建具有约束条件的表,并使用检查约束来确保数据的完整性。
CNXY
2017/12/25
2.9K0
1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表
SQL的单表查询
create database mydb1; Create database mydb2 character set gbk; Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
全栈程序员站长
2021/07/22
2.2K0
SQL查询表和存储过程创建修改日期
查询建立时间  --表 select * from sysobjects where id=object_id(N'表名') and xtype='U'   --表的结构    select * from syscolumns where id=object_id(N'表名')      --存储过程    select * from sysobjects where id=object_id(N'存储过程名') and xtype='P'   查询最后修改时间  --存储过程 select name,mo
跟着阿笨一起玩NET
2018/09/18
1.6K0
SQL语句查询结果集中的动态修改案例(临时表+游标)
本文转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090314.html
跟着阿笨一起玩NET
2018/09/18
2.2K0
使用SQL语句创建表_用sql语句创建员工表
create table 表名 (列1 数据类型 1,列2 数据类型) tablespace 表空间
全栈程序员站长
2022/11/19
4.1K0
使用SQL语句创建表_用sql语句创建员工表
Flink 动态表的持续查询
越来越多的公司采用流处理,并将现有的批处理应用迁移到流处理,或者对新的用例采用流处理实现的解决方案。其中许多应用集中在流数据分析上,分析的数据流来自各种源,例如数据库事务、点击、传感器测量或IoT 设备。
smartsi
2019/08/08
2.1K0
Flink 动态表的持续查询
MySQL 批量插入表数据 sql
INSERT INTO `swork_info`.`quality_data_app_base_value` (`gmt_create`, `gmt_modified`, `app_id`, `base_value`, `type`) select now(), now(), app_id, 100, '0' from application;
一个会写诗的程序员
2018/08/17
4.5K0
SQL为王:oracle标量子查询和表连接改写
小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化、SQL优化和troubleshooting 编辑手记:如何提高数据的查询效率是每个人都关注的问题,今天让我们来学习如何合理使用标量子查询和表连接方式来提高查询速度吧~ 之前小鱼就听过了标量子查询,不过对于其中的细节理解还是远远不够,借助一部分资料和自己测试对标量子查询做一点简单的分析和介绍。 Oracle允许在select子句中包含单行子查询,这个也就是oracle的标量子查询,标量子查询有点类似于外连接,当使
数据和云
2018/03/06
3.3K0
SQL为王:oracle标量子查询和表连接改写
怎么创建数据表_sqlserver创建表的sql语句
知识点:数据库表的相关概念、创建数据库表的方法、设计数据库表、向数据库表中插入数据、建立不同数据库表之间的关系、删除数据库表。
全栈程序员站长
2022/11/17
3.2K0
怎么创建数据表_sqlserver创建表的sql语句
SQL之单表查询
附上下面要用到的数据库和表的 SQL 语句,在数据库管理页面新建一个查询然后使用 CV 大法转移过去执行即可:
wsuo
2020/07/30
1.8K0
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
sqlserver怎么用语句创建表_mysql查询表的创建语句
原文地址:http://database.51cto.com/art/201010/231018.htm
全栈程序员站长
2022/11/02
8.7K0
Flink:动态表上的连续查询
越来越多的公司在采用流处理技术,并将现有的批处理应用程序迁移到流处理或者为新的应用设计流处理方案。其中许多应用程序专注于分析流数据。分析的数据流来源广泛,如数据库交易,点击,传感器测量或物联网设备。
Spark学习技巧
2018/08/01
2.9K0
Flink:动态表上的连续查询
MyBatis框架动态查询Sql
今天写一个接口,查询监测数据,传感器有100多个监测因子,也就是数据库中一条数据对应100多个字段,前端勾选需要查询的监测因子,所以接口就需动态查询字段,幸运的是Mybatis支持这种查询
赵哥窟
2020/07/28
5800
利用动态SQL创建视图
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处
overme
2022/01/18
1.4K0
利用动态SQL创建视图

相似问题

为具有多种关系的表创建Hibernate条件查询

23

创建具有关系SQL的表

22

具有动态sql变量插入查询的OpenRowset

11

具有嵌套/层次关系表的SQL查询

115

具有动态sql查询的更新表

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档