首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从这些副本中净化我的数据库?

如何从这些副本中净化我的数据库?
EN

Stack Overflow用户
提问于 2012-08-07 21:16:11
回答 1查看 83关注 0票数 0

我有一个具有以下字段的表: id _ domainname \\ domain_certificate_no _

select语句的输出示例如下:

代码语言:javascript
复制
'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_no02aa6aa.netsolstores.com_1,因为它是1,并且密钥具有重复值),然后我想删除整个链,即02aa6aa.netsolstores.com_202aa6aa.netsolstores.com_3,并删除这个链所属的域名02aa6aa.netsolstores.com

如何使整个DB的检查过程自动化。因此,我有一个查询,它检查模式('%.%.%) 编辑:中的任何域名,并且它们有共享的域名(在这个ex:netsolstores.com中),如果它找到属于这个域名的cert no. 1有一个重复的键值,那么删除。否则就不会了。请注意,请注意,如果domain_certificate_no不是数字1,那么它可以有重复值。

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

EN

回答 1

Stack Overflow用户

发布于 2012-08-07 22:13:17

我不知道在你的例子中“02aa6aa.netsolstores.com_1”会发生什么。

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

代码语言:javascript
复制
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“版本。如果这一点很重要,那么查询就可以很容易地修改。

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

代码语言:javascript
复制
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)

还有其他更有效的表达方法(取决于数据库)。不过,这保留了原始查询的结构。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11854261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档