如何使用带有 WITH 子句的 INSERT 语句?

Posted

技术标签:

【中文标题】如何使用带有 WITH 子句的 INSERT 语句?【英文标题】:How to use INSERT statement with WITH clause? 【发布时间】:2021-02-22 08:47:56 【问题描述】:

我的目标是使用 WITH 子句将数据插入到多个表中。

我试过的,一步一步测试:

    使用 INSERT 语句进行测试
INSERT INTO user VALUES (default, 'test2', 'test', 1);
Update count: 1
(2 ms)
    使用 WHERE 子句进行测试。
SELECT 1 WHERE EXISTS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0');
1  
1
(1 row, 1 ms)
    使用 WITH 子句进行测试。
WITH temp AS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0')

SELECT 1 FROM temp;
1  
1

这就是问题所在 4. 使用 WHERE 和 WITH 子句进行测试

WITH temp AS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0')

SELECT 1 WHERE EXISTS (temp);

我的预期结果是 SQL 语句应该返回一行。

我的实际结果是数据库抛出错误:

Syntax error in SQL statement "WITH TEMP AS (SELECT 1 FROM ORGANIZATION_MEMBER WHERE USER='628111234567' AND ROLE='0')

SELECT 1 WHERE EXISTS (TEMP[*])"; expected "(, WITH, SELECT, TABLE, VALUES"; SQL statement:
WITH temp AS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0')

SELECT 1 WHERE EXISTS (temp) [42001-200] 42001/42001 (Help)

这可能是我打算使用的解决方案

WITH temp AS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0')

INSERT INTO user (default, 'test', 'test', 1) WHERE EXISTS (SELECT 1 FROM temp)
INSERT INTO user_detail (default, 'test', 'test') WHERE EXISTS (SELECT 1 FROM temp);

【问题讨论】:

你的数据库是 mysql 还是 H2?它们不是一回事。 @TimBiegeleisen 我使用 MySQL 进行生产,使用 H2 进行开发。 坏主意:总是使用同一个数据库进行开发和部署,除非有非常正当的理由不这样做(通常没有)。跨度> @TimBiegeleisen 非常有名。我将尝试切换 MySQL 进行开发。 【参考方案1】:

在第 4 个示例中,您需要在 EXISTS 子句中使用正式的 SELECT

WITH temp AS (SELECT 1 FROM organization_member WHERE user='628111234567' AND role='0')

SELECT 1 WHERE EXISTS (SELECT 1 FROM temp);

【讨论】:

嗨,我使用 WITH 子句的目的是减少 N+1 问题。这算作 N+1 问题吗?我打算使用带有 WHERE EXISTS 子句的 INSERT 语句创建 2 - 3 行。 @kidfrom 我已经更正了你的语法。我不知道你在这里真正想做什么,这个问题并没有帮助我弄清楚。 谢谢,它确实解决了我的问题。无论如何,我已经写了我将要使用的可能的解决方案。您对 SQL 语句的性能有何看法。 我很难确定。应该使用 CTE 来避免代码的重复,同时也可以使代码更简洁、更易于理解。如果您发现使用 CTE 会使事情变得更加复杂,请不要使用它们。 注意到了。 CTE不是等于存储临时表还是只是为了避免代码重复?

以上是关于如何使用带有 WITH 子句的 INSERT 语句?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:with 查询

GREENPLUM中的with,即CTE用法,转自gp中文网文档

带有插入语句的 Where 子句

WITH 子句可以在不使用 Select 语句的情况下具有硬编码值吗?

mysql with recursive 递归用法

mysql with recursive 递归用法