2012-08-07 51 views
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_no02aa6aa.netsolstores.com_1,因为它是数字1,并且具有重复的密钥值,那么我想删除整个链,即02aa6aa.netsolstores.com_202aa6aa.netsolstores.com_3,并通过删除域名此链属于02aa6aa.netsolstores.com

如何自动执行整个数据库的检查过程。所以,我有一个查询,检查模式中的任何域名('%.%.%)编辑:而且他们有共享域名(在这个例子中:netsolstores.com),如果它发现证书号。 1属于这个域名有一个重复的键值,然后删除。否则不。请记达,这是确定的domain_certificate_no有重复的值,如果它不是数1

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

+0

您能澄清一下“删除链”位吗?如果你要删除'02aa6aa.netsolstores.com'来删除链条,你在保留什么?有没有你想要'_2'等的情况? – 2012-08-07 21:20:36

+0

在这个例子中,如果我删除了:'02a1fae.netsolstores.com',我会保留其他域'02aa6aa.netsolstores.com'。换句话说,如果证书没有,我不需要整个链。 1有重复的关键。如果删除_1,我不需要_2。 – 2012-08-07 21:23:28

+0

但请记住我添加的编辑。比较之处在于具有共同主名称但不同子级域名的域名。即如果有不同域名的重复,比如说'02a1fae.msn.com',那么就没问题。根本不需要与其他域名进行比较。 – 2012-08-07 21:25:14

回答

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子句,那么在记录所有行之后,所有的行都会消失。您可能会发现,只需将所需结果选择到新表格中,验证它们,然后截断旧表格并重新插入即可。

+0

在我看来这是一个选择声明。我需要删除重复的值。一般来说,当我试图删除查询(在工作台)中产生的记录时,它不允许我。它标记为只读。 – 2012-08-07 22:23:03

+0

您想保留的记录的逻辑是否正确? – 2012-08-07 22:25:21

+0

我不这么认为。我不需要保留任何重复键的最小值。我想保留共享域名的域名的任何重复密钥的最小值(在我的例子中,共享域名是:'netsolstores.com')。 – 2012-08-07 22:31:25

相关问题