0

値が同じであってはならない列を持つテーブルがあります。実装が不十分なため、ソフトウェアはユーザーが重複を入力したかどうかを確認しません。したがって、列内のすべての値を調べて、そうでないことを確認する「単純な」SQLステートメントまたは関数を作成するタスクを委託されました。同一。SQL自体は月に1回実行されるため、効率的である必要はありません。

列にはintが格納されており、重複する値の1つをインクリメントし、その列に同じ値を持つエントリがテーブルになくなるまで、毎回それを続けたいと思います。私が何をすべきか提案はありますか?どこから始めればいいのかわからない。

洞察力を持ってくれた人に感謝します。

編集:申し訳ありませんが、重複していないデータの値はそのままにしておく必要があることを忘れてしまいました。これらはお客様に使用される設定であり、値が重複している場合にのみ罰する必要があります。そうでなければ、私たちは彼らの設定を破壊するべきではありません、さもないと彼らは怒ります。

これは1つのテーブルであり、多くの列が含まれていますが、特にこの1つの特定の列は、int型であり、nullを含まないため、重複することはありません。

4

3 に答える 3

1

問題のサイズを知るには、次のようなものを試してください。mysqlがわからないため、Oracleの構文ですが、同等のものがあるはずです。

SELECT your_col, COUNT(your_col)
  FROM your_table
 GROUP BY your_col

重複を見つけたときに値をインクリメントするのが最善の方法だとは思いません。最初から解決するときに別の重複を作成することもできます。各増分の後で、最初からもう一度確認する必要があります。正しいアプローチは、データの入力に使用されるものに検証を追加して、重複を拒否することです。そうすれば、少なくともデータを1回だけクリーンアップする必要があります。

それがあなたが望んでいたものではない場合は申し訳ありません:-)

ETAあなたの会社は間違っています。少なくとも長期的には、週に1回SQLを実行する方が安くはありません。あなたはステッチが必要なものに石膏を叩きます。今すぐヒットして根本的な問題を解決する方がはるかに良いでしょう。まず、重複を望まないが、とにかくそれらを入力できる列です。そもそもmajotWTFがあります。

于 2012-06-27T14:20:32.920 に答える
1
 create table tableName (KeyCol int identity(1,1), intCol int)
 insert into tableName values (1), (2), (2), (3), (5), (6), (5), (7), (9)


While exists (
    select intCol
    from tableName
    group by intCol
    having count(*) > 1
)
begin

    declare @newValue int

    select @newValue = min(t1.intCol) + 1
    from tableName t1
    left join tableName t2
    on t1.intCol + 1 = t2.intCol
    where t2.intCol is null

    update tx
    set intCol = @newValue
    from tableName tx
    where intCol = 
    (select top 1 intCol
    from tableName t1
    group by intCol
    having count(*) > 1
    order by intCol)
    and KeyCol = (select min(KeyCol) from tableName t2 where t2.intCol = tx.intCol)
end

select * from tableName order by 2
于 2012-06-27T14:22:07.827 に答える
0

この列を削除して、一意のデータを再作成または再入力して、UNIQUE INDEXを追加してみませんか?

于 2012-06-27T14:10:32.323 に答える