PostgreSQL:使用 id 从 table 中删除行
PostgreSQL: Remove rows from a table using id's
我有一个帐单 table,其中 ID 作为 pk 和一个 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'
)
我能知道为什么会这样吗?
您似乎要删除所有 重复行。如果你想要一个没有重复的结果集,使用 distinct on
:
select distinct on (billno) b.*
from bill b
order by billno, id desc;
这 returns 每个账单的行最高 id
。
我不确定为什么您的查询会过滤到该公司。该问题未提及该过滤。
我有一个帐单 table,其中 ID 作为 pk 和一个 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'
)
我能知道为什么会这样吗?
您似乎要删除所有 重复行。如果你想要一个没有重复的结果集,使用 distinct on
:
select distinct on (billno) b.*
from bill b
order by billno, id desc;
这 returns 每个账单的行最高 id
。
我不确定为什么您的查询会过滤到该公司。该问题未提及该过滤。