删除“关系不存在”的PostgreSQL
我正在使用postgreSQL 9.1,我想使用以下提示从我的表中删除重复项: 因此,我的查询如下所示:删除“关系不存在”的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
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。。。原来的问题没有这样的问题