0

我有一个包含以下字段的表:id | 域名 | domain_certificate_no | 核心价值

select 语句的输出示例如下:

'57092', '02a1fae.netsolstores.com', '02a1fae.netsolstores.com_1', '55525772666'
'57093', '02a1fae.netsolstores.com', '02a1fae.netsolstores.com_2', '22225554186'
'57094', '02a1fae.netsolstores.com', '02a1fae.netsolstores.com_3', '22444356259'
'97168', '02aa6aa.netsolstores.com', '02aa6aa.netsolstores.com_1', '55525772666'
'97169', '02aa6aa.netsolstores.com', '02aa6aa.netsolstores.com_2', '22225554186'
'97170', '02aa6aa.netsolstores.com', '02aa6aa.netsolstores.com_3', '22444356259’

keyvalue我需要清理我的数据库,这样:我想删除第一个重复的域名domain_certificate_no(即,在本例中,我查找字段domain_certificate_no: 02aa6aa.netsolstores.com_1,因为它是数字 1,并且键具有重复值,然后我想通过删除该链所属的域名来删除整个链 is 02aa6aa.netsolstores.com_2and this 通过删除 is .02aa6aa.netsolstores.com_302aa6aa.netsolstores.com

如何自动化整个数据库的检查过程。所以,我有一个查询,检查模式中的任何域名('%.%.%) EDIT: AND 他们有共享域名(在这个 ex: 中netsolstores.com),如果它找到证书号。属于这个域名的1有一个重复的key值,然后删除。否则没有。请注意,domain_certificate_no如果不是数字 1,则可以有重复值。

编辑:我只比较相同二级域名的重复值。例如:在这个问题中,我比较了共享域名的值: .netsolstores.com. 如果我有另一个域名,带有子域,我也会这样做。但关键是我不需要比较整个数据库。只有具有共享域名的值(但不同的子域)。

4

1 回答 1

0

我不确定您的示例中的 '02aa6aa.netsolstores.com_1' 会发生什么。

以下仅保留任何重复键的最小 id:

with t as (
     select t.*,
            substr(domain_certificate_no,
                   instr(domain_certificate_no, '_') + 1, 1000) as version,
            left(domain_certificate_no, instr(domain_certificate_no, '_') - 1) as dcn
     from t
    )
select t.*
from t join
     (select keyvalue, min(dcn) as mindcn
      from t
      group by keyvalue
     ) tsum
     on t.keyvalue = tsum.keyvalue and
        t.dcn = tsum.mindcn 

对于您提供的数据,这似乎可以解决问题。这不会返回重复的“_1”版本。如果这很重要,那么可以很容易地修改查询。

虽然我更喜欢更积极(考虑要保留而不是删除的行),但以下内容应该删除您想要的内容:

with t as (
     select t.*,
            substr(domain_certificate_no,
                   instr(domain_certificate_no, '_') + 1, 1000) as version,
            left(domain_certificate_no, instr(domain_certificate_no, '_') - 1) as dcn
     from t
    ),
    tokeep as (
     select t.*
     from t join
          (select keyvalue, min(dcn) as mindcn
           from t
           group by keyvalue
          ) tsum
          on t.keyvalue = tsum.keyvalue and
             t.dcn = tsum.mindcn
    )
delete from t
where t.id not in (select id from tokeep)

还有其他可能更有效的表达方式(取决于数据库)。但是,这保留了原始查询的结构。

顺便说一句,在尝试新的 DELETE 代码时,请确保存储表的副本。使用 DELETE(和 UPDATE)很容易出错。例如,如果您省略 WHERE 子句,那么在记录所有行的漫长痛苦过程之后,所有行都将消失。您可能会发现只需将所需结果选择到新表中,验证它们,然后截断旧表并重新插入它们会更快。

于 2012-08-07T22:13:17.793 回答