【问题标题】:SQL - Using WITH to declare variable on INSERT INTOSQL - 使用 WITH 在 INSERT INTO 上声明变量
【发布时间】:2020-06-30 19:57:08
【问题描述】:

在执行INSERT INTO 时,我正在尝试使用WITH 为查询声明一个变量。 我正在关注https://stackoverflow.com/a/16552441/2923526,它为SELECT 查询提供了以下示例:

WITH myconstants (var1, var2) as (
   values (5, 'foo')
)
SELECT *
FROM somewhere, myconstants
WHERE something = var1
   OR something_else = var2;

我尝试了以下方法,但没有成功:

playground> CREATE TABLE foo (id numeric)
CREATE TABLE

playground> WITH consts (x) AS (VALUES (2)) INSERT INTO foo VALUES (x)
column "x" does not exist
LINE 1: WITH consts (x) AS (VALUES (2)) INSERT INTO foo VALUES (x)
                                                                ^

playground> WITH consts (x) AS (VALUES (2)) INSERT INTO foo VALUES (consts.x)
missing FROM-clause entry for table "consts"
LINE 1: ...consts (x) AS (VALUES (2)) INSERT INTO foo VALUES (consts.x)
                                                              ^

playground> WITH consts (x) AS (VALUES (2)) INSERT INTO foo VALUES (consts.x) FROM consts
syntax error at or near "FROM"
LINE 1: ...AS (VALUES (2)) INSERT INTO foo VALUES (consts.x) FROM const...
                                                             ^

playground> WITH consts (x) AS (VALUES (2)) INSERT INTO foo FROM consts VALUES (consts.x)
syntax error at or near "FROM"
LINE 1: WITH consts (x) AS (VALUES (2)) INSERT INTO foo FROM consts ...
                                                        ^

注意我是 SQL 初学者,所以我希望避免使用 PLPGSQL 的解决方案

【问题讨论】:

    标签: sql postgresql sql-insert common-table-expression


    【解决方案1】:

    我认为你想要:

    WITH consts (x) AS (VALUES (2)) INSERT INTO foo SELECT x FROM consts
    

    即:WITH 子句创建一个派生表,然后您可以在主查询中使用该表;所以你实际上需要SELECT ... FROM 公用表表达式。

    【讨论】:

    • 行得通,谢谢。我很困惑为什么不需要INSERT INTO 中的第二个VALUES,但猜测这与WITH 语句无关(只是关于INSERT INTO 的语法)对吧?
    • 你是对的。见Postgres Insert。如有必要,请选择您的特定版本。精简到最基本的是 2 种插入格式:格式 1。插入 (...) 值 (...)。格式 2。Insert(...) Select ... from table_name 正如@FranciscoFigari 指出的那样,CTE (with) 刚刚为格式 2 提供了 table_name
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多