如何从 Postgres 中的 CTE(公用表表达式)中删除记录

blo*_*ter 5 sql postgresql common-table-expression sql-delete

我在 Postgres 中使用 CTE 编写了以下查询。现在我无法从中删除记录。

WITH cte AS (
    SELECT 
   
        firstname, 
        lastname, 
        country, 
        ROW_NUMBER() OVER (
            PARTITION BY 
                firstname, 
                lastname, 
                country
        ) row_num
     FROM 
        employee
) 
delete  from cte
where row_num >1
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,它显示错误:

关系“cte”不存在

这是我的表“员工”的示例

id  firstname  lastname  country
1   "Raj"      "Gupta"   "India"
2   "Raj"      "Gupta"   "India"
3   "Mohan"    "Kumar"   "USA"
4   "James"    "Barry"   "UK"
5   "James"    "Barry"   "UK"
6   "James"    "Barry"   "UK"
Run Code Online (Sandbox Code Playgroud)

S-M*_*Man 9

无法从 CTE 中删除。

你可以这样做:

演示:db<>小提琴

DELETE FROM employee
WHERE id IN (
    SELECT
        id
    FROM (
        SELECT
            id,
            ROW_NUMBER() OVER (PARTITION BY firstname, lastname, country) row_num
        FROM 
            employee
    ) s
    WHERE row_num > 1
)
Run Code Online (Sandbox Code Playgroud)

如果您仍然想使用 CTE,则可以将子查询移至其中:

演示:db<>小提琴

WITH cte AS (
    SELECT
        id
    FROM (
        SELECT
            id,
            ROW_NUMBER() OVER (PARTITION BY firstname, lastname, country) row_num
        FROM 
            employee
    ) s
    WHERE row_num > 1
)
DELETE FROM employee
WHERE id IN (SELECT * FROM cte)
Run Code Online (Sandbox Code Playgroud)


Sak*_*med 1

您无法从 postgresql 中的 CTE 表中删除记录。尽管在 SQLSERVER 等其他数据库服务器中也是可能的。您可以查看postgresql 的CTE文档。