【问题标题】:How to write DELETE Statement with Inner Query in PostgreSQL?如何在 PostgreSQL 中使用内部查询编写 DELETE 语句?
【发布时间】:2021-10-08 01:07:44
【问题描述】:

以下查询在 Oracle DB 中运行良好。 相同的查询在 Postgres DB 中失败,但内部查询在 Postgres DB 中运行良好。

DELETE FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY A.RESORT, A.RESV_NAME_ID ORDER BY ACTION_ID DESC) RNK
FROM STAGE_DETAILS A ) B 
WHERE B.RNK>1;

我收到语法错误。

错误:- [代码:0,SQL 状态:42601] 错误:“(”位置或附近的语法错误:13 [脚本位置:3109 - 3110]

如何解决这个问题?

谢谢。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    使用以下语法

    DELETE FROM STAGE_DETAILS A
    USING (SELECT ACTION_ID,RESV_NAME_ID,ROW_NUMBER() OVER (PARTITION BY RESORT, RESV_NAME_ID ORDER BY ACTION_ID DESC) RNK
         FROM STAGE_DETAILS) B
    WHERE B.RNK>1 AND B.ACTION_ID = A.ACTION_ID AND B.RESV_NAME_ID = A.RESV_NAME_ID;
    

    【讨论】:

    • 谢谢。对于包含 15000 条记录的表,它可以工作,大约需要 1 秒。
    【解决方案2】:

    您不能从 Postgres 中的子查询中删除。这应该做你想做的:

    DELETE FROM STAGE_DETAILS SD
        WHERE ACTION_ID < (SELECT MAX(SD2.ACTION_ID)
                           FROM STAGE_DETAILS SD2
                           WHERE SD2.RESORT = SD.RESORT AND
                                 SD2.RESV_NAME_ID = SD.RESV_NAME_ID
                          );
    

    【讨论】:

    • 谢谢,它可以工作,但需要更多时间......包含 15000 条记录的表大约需要 20 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2013-07-07
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多