簡體   English   中英

PostgreSQL with-delete“關系不存在”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM