【发布时间】:2013-03-21 00:09:05
【问题描述】:
我有一个taccounts 表,其中包含account_id(PK)、login_name、password、last_login 等列。现在我必须根据新的业务逻辑删除一些重复的条目。
因此,重复帐户将使用相同的email 或相同(login_name 和password)。必须保留最新登录的帐户。
这是我的尝试(一些电子邮件值为 null 和空白)
DELETE
FROM taccounts
WHERE email is not null and char_length(trim(both ' ' from email))>0 and last_login NOT IN
(
SELECT MAX(last_login)
FROM taccounts
WHERE email is not null and char_length(trim(both ' ' from email))>0
GROUP BY lower(trim(both ' ' from email)))
login_name 和 password 也是如此
DELETE
FROM taccounts
WHERE last_login NOT IN
(
SELECT MAX(last_login)
FROM taccounts
GROUP BY login_name, password)
有没有更好的方法或任何方法来组合这两个单独的查询?
还有一些其他表有account_id 作为外键。 如何更新这些表的更改?`
我正在使用 PostgreSQL 9.2.1
编辑:一些电子邮件值为空,其中一些为空白('')。因此,如果两个帐户的登录名和密码不同,并且他们的电子邮件为空或空白,则必须将它们视为两个不同的帐户。
【问题讨论】:
-
根据新规则,粗略估计的重复百分比是多少?
account_id是主键吗?什么版本的 PostgreSQL?你能负担得起将表锁定一段时间(无并发访问)吗? -
@ErwinBrandstetter 大约有 4500 行,其中大约 430 行是唯一的。是的
account_id是主键。 Postgre 版本 1.16.0。实际上不需要锁定,因为我正在处理一些迁移问题 -
请在您的数据库中运行
SELECT version()。 1.16 可能是您似乎正在使用的 pgAdmin 版本。并使用附加(基本)信息编辑您的问题。 -
@ErwinBrandstetter 我已经用 Pk 和版本信息编辑了问题
-
更多细节:
last_login可以恰好是一对骗子吗?并且login_name和password也可以是NULL。以及如何处理?
标签: sql database postgresql duplicate-removal postgresql-9.2