![](/img/trans.png)
[英]Postgresql tables exists, but getting "relation does not exist" when querying
[英]PostgreSQL with-delete “relation does not exists”
我正在使用postgreSQL 9.1,我想使用這個技巧從我的表中刪除重復項: https : //stackoverflow.com/a/3822833/2239537
所以,我的查詢看起來像這樣:
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和delete,如:
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中的CTE中編寫DDL語句(參見文檔 ),這可能非常方便。 例如,您可以從card
刪除所有行,然后僅插入具有row_number = 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
);
對我來說,它在Postgres / GreenPlum中的效果如下:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.