0

次のフィールドを持つテーブルがあります。ドメイン名 | 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を探します。これは番号 1 であり、キーの値が繰り返されているためです。次に、このチェーンが属するドメイン名を削除することにより、チェーン全体を削除したいと思います。domain_certificate_no02aa6aa.netsolstores.com_102aa6aa.netsolstores.com_202aa6aa.netsolstores.com_302aa6aa.netsolstores.com

DB 全体のチェック プロセスを自動化するにはどうすればよいですか。したがって、パターン('%.%.%) EDIT: AND they have share domain name (in this ex: netsolstores.com) のドメイン名をチェックするクエリがあります。このドメイン名に属する 1 つのキー値が重複している場合は、削除します。そうでなければいいえ。domain_certificate_no数字が 1 でない場合は、値を繰り返しても問題ないことに注意してください。

編集:同じ第 2 レベル ドメイン名の繰り返し値のみを比較します。例: この質問では、ドメイン名を共有する値を比較します: .netsolstores.com. サブレベル ドメインを持つ別のドメイン名がある場合は、同じことを行います。しかし、要点は、DB 全体を比較する必要がないということです。共有ドメイン名の値のみ (ただし、サブドメインは異なります)。

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 に答える