合并返回到没有 CTE 的临时表

问题描述 投票:0回答:1

这样的事情是否可以不用使用

WITH

可以使用
CREATE TEMP TABLE temp AS
代替手动创建临时表吗?

CREATE TEMP TABLE temp
(   action    text,
    winery_id int,
    brand     text );

MERGE INTO wines w
USING wines_updates u
ON u.winery_id = w.winery_id
WHEN MATCHED THEN
    UPDATE
    SET stock = u.stock
RETURNING merge_action() action, w.winery_id, w.brand 
INTO temp;
sql postgresql sql-merge sql-returning postgresql-17
1个回答
0
投票

不幸的是,没有。作为 DML 语句,

MERGE
不能直接在 子查询 中使用,它不能作为
create table as
的直接源,并且除了该子句之外,它不提供额外的
into
子句在顶部。

这与

MERGE
的工作方式无关,而是与一般情况下允许任何 数据修改语句 相关,无论有或没有
returning
子句。

您必须参与 CTE:

CREATE TEMP TABLE tmp AS
WITH cte AS(
    MERGE INTO wines w
    USING wines_updates u
    ON u.winery_id = w.winery_id
    WHEN MATCHED THEN
        UPDATE
        SET stock = u.stock
    RETURNING merge_action() action, w.winery_id, w.brand)
SELECT*FROM cte;

CREATE TABLE AS
明确列出了必须遵循的查询类型:

query

SELECT
TABLE
VALUES
命令,或者运行准备好的
EXECUTE
SELECT
TABLE
查询的
VALUES
命令。

SELECT INTO
还必须涉及 CTE:

WITH cte AS(
    MERGE INTO wines w
    USING wines_updates u
    ON u.winery_id = w.winery_id
    WHEN MATCHED THEN
        UPDATE
        SET stock = u.stock
    RETURNING merge_action() action, w.winery_id, w.brand)
SELECT*INTO TEMP TABLE tmp2 FROM cte;

其他 DML(如

insert
update
delete
)也不能用作
create table as
的直接源。您也不能用模仿
into
语法的
select into
来创建表格。

© www.soinside.com 2019 - 2024. All rights reserved.