SQL插入多行,但只执行一次子查询

Posted

技术标签:

【中文标题】SQL插入多行,但只执行一次子查询【英文标题】:SQL Insert Into multiple rows, but execute subquery only once 【发布时间】:2014-06-24 13:19:34 【问题描述】:

我正在尝试优化 INSERT INTO 语句以仅使用一次子查询,因为它始终是相同的值:

这是我的示例代码

INSERT INTO TABLE1 (id, number) VALUES 
((SELECT other_id from TABLE2 WHERE somevalue = "test"), 12),
((SELECT other_id from TABLE2 WHERE somevalue = "test"), 13),
...,
...;

不是 sql 专家,但这看起来不是一个好方法,因为每次插入都会执行相同的子查询。

有其他解决方案吗?

另外,我知道我可以事先选择 ID 并将其存储在这样的变量中(类似伪代码):

$var = mysql_query("SELECT other_id from TABLE2 WHERE somevalue = 'test'")
 mysql_query("INSERT INTO TABLE1 (id, number) VALUES 
    ($var, 12),
    ($var, 13);")

【问题讨论】:

【参考方案1】:
INSERT
INTO    table1 (id, number)
SELECT  other_id, number
FROM    table2
CROSS JOIN
        (
        SELECT  12 number
        UNION ALL
        SELECT  13
        ) q
WHERE   somevalue = 'test'

【讨论】:

如果不止两个值怎么办?我不需要创建一个巨大的连接表吗? 是的,但是这些应该很快(因为您只需选择常量并将结果合并在一起),而对数据的实际查询只执行一次。如果这些数字存储在一个表中(例如,如果它们是另一个表上记录的键),那么您可以使用 IN(13,13) 而不是联合常量来连接该表。

以上是关于SQL插入多行,但只执行一次子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 子查询——匹配多行

子查询(嵌套子查询)

MySql - 使用连接子查询插入多行?

如何使用子查询的多行返回值插入表中?

MySQL exists 原理/用法

C#查询出多行数据但只在datagridview中显示其中某一行