删除“关系不存在”的PostgreSQL

删除“关系不存在”的PostgreSQL,sql,postgresql,postgresql-9.1,Sql,Postgresql,Postgresql 9.1,我正在使用postgreSQL 9.1,我想使用以下提示从我的表中删除重复项: 因此,我的查询如下所示: WITH cte AS (SELECT ROW_NUMBER() OVER (PARTITION BY code, card_id, parent_id ORDER BY id DESC) RN FROM card) DELETE FROM cte WHERE RN > 1 但它告诉我 ERROR: relation "cte" does not exi

我正在使用postgreSQL 9.1,我想使用以下提示从我的表中删除重复项:

因此,我的查询如下所示:

WITH cte
 AS (SELECT ROW_NUMBER() 
 OVER (PARTITION BY code, card_id, parent_id 
     ORDER BY id DESC) RN
     FROM card)
DELETE FROM cte
WHERE RN > 1
但它告诉我

ERROR: relation "cte" does not exist
SQL state: 42P01
Character: 157
但是,这一说法很有效:

WITH cte
 AS (SELECT ROW_NUMBER() 
 OVER (PARTITION BY code, card_id, parent_id 
     ORDER BY id DESC) RN
     FROM merchantcard)
SELECT * FROM cte
WHERE RN > 1
有什么办法让它工作吗?
谢谢

这是因为PostgreSQL中的CTE与SQL Server中的CTE工作方式不同。在SQL Server中,CTE就像一个可更新的视图,所以您可以从中删除或更新它们,而在PostgreSQL中则不能

您可以加入cte并删除,如:

with cte as (
    select
        id,
        row_number() over(partition by code, card_id, parent_id order by id desc) as rn
    from card
)
delete
from card
where id in (select id from cte where rn > 1)
另一方面,您可以在PostgreSQL see中的CTE中编写DDL语句,这可能非常方便。例如,您可以从卡中删除所有行,然后仅插入行数=1的行:

with cte1 as (
    delete
    from card
    returning *
), cte2 as (
    select
        row_number() over(partition by code, card_id, parent_id order by id desc) as rn,
        *
    from cte1
)
insert into card
select <columns here>
from cte2
where rn = 1

我知道,您正在询问如何使用WITH语句解决您的问题,并且已经得到了一个很好的答案。但我建议在你链接的同一个问题中寻找替代方案

这个怎么样

DELETE FROM card
WHERE id NOT IN (
  SELECT MIN(id) FROM card
  GROUP BY code, card_id, parent_id 
);

对我来说,它在博士后/绿梅中的作用是这样的:

delete
from card where id in (
with cte as (
    select
        id,
        row_number() over(partition by code, card_id, parent_id order by id desc) as rn
    from card
)
select id from cte where rn > 1);

哇,谢谢你的快速回复和有用的回答!为我工作,只需要从卡片中添加删除,但这当然只是打字错误。第一个解决方案似乎是为我删除表中的所有行。我不理解cte的行为:如果我从cte中选择count1,其中rn>1,我会得到正确的数字,但在从cte中选择id的卡中选择count1,其中rn>1返回所有rows@ArkadiyKukarkin可能是id不是唯一的吗?为了帮助你,最好有更多关于你想要投票的结构和结果的信息!这也适用于多列吗?我有一个例子,从表中删除,其中a,b在select a中,b在cte a中,b在我的表中形成一个复合键。这是我见过的在PostgreSQL中检测和清除重复记录的最清晰的方法。谢谢。那为什么我会得到这么多的反对票呢?不告诉我是不公平的。可能是因为您的解决方案要求已经存在一个唯一的密钥id,可以在where。。。原来的问题没有这样的问题