PostgreSQL with-delete “relation does not exists”

后端 未结 3 635
借酒劲吻你
借酒劲吻你 2020-12-15 07:55

I am using postgreSQL 9.1 and I want to delete duplicates from my table using this tip: https://stackoverflow.com/a/3822833/2239537

So, my query looks like that:

3条回答
  •  悲哀的现实
    2020-12-15 08:32

    that's because CTE in PostgreSQL works differently than CTE in SQL Server. In SQL Server CTE are like an updatable views, so you can delete from them or update them, in PostgreSQL you cannot.

    you can join cte and delete, like:

    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)
    

    On the other hand, you can write DDL statements inside CTE in PostgreSQL (see documentation) and this could be very handy. For example, you can delete all rows from card and then insert only those having 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 
    from cte2
    where rn = 1
    

提交回复
热议问题