【问题标题】:PostgreSQL: Remove rows from a table using id'sPostgreSQL:使用 id 从表中删除行
【发布时间】:2021-06-27 06:14:15
【问题描述】:

我有一个 id 作为 pk 的 bill 表和一个 billno 列,我应该从中删除重复项

总行数 (62924)

select count(billno) from bill

唯一的 billno (59704),因此需要删除 3220 行

select count(distinct billno) from bill

查询以获取重复项 (3220)

select count(*) from bill
    WHERE bill.billno IN (SELECT billno
                   FROM bill
                   GROUP BY billno HAVING COUNT(*) > 1)
    AND bill.company_code like '1'

但是,当我按 id 删除重复项时,总数不相符:-

删除重复行后计数 (61385) => 应在此处获取 59704..

select count (*) from bill
where bill.id not in
(
select id from bill
    WHERE bill.billno IN (SELECT billno
                   FROM bill
                   GROUP BY billno HAVING COUNT(*) > 1)
    AND bill.company_code like '1'
)

我能知道为什么会这样吗?

【问题讨论】:

    标签: sql postgresql duplicates primary-key


    【解决方案1】:

    您似乎要删除 所有 个重复的行。如果您想要一个没有重复的结果集,请使用distinct on

    select distinct on (billno) b.*
    from bill b
    order by billno, id desc;
    

    这将返回具有最高id 的每个账单的行。

    我不确定您的查询为何会过滤该公司。该问题未提及该过滤。

    【讨论】:

    • 我注意到重复的 company_code '1' 和 '9' 不同,因此我选择保留更高的 company_code。如果我要在你的查询中使用这个逻辑,我必须order by billno, company_code desc 对吗?
    • @Pavitran 。 . .是的,您可以在order by 中包含公司代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多