2012-08-07 88 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

相關問題