2016-08-04 22 views
0

列Bに異なるデータを持つ列Aに基づいて重複行を検索する必要があります。次に、列Bを更新する必要があります同じデータは、ゼロデータよりも>に基づいています。 1つのレコードが列B = 0000で、他のレコードが列B = 1234の場合は、最初のレコード列Bを1234に更新します。IDがレコードの1つである場合は、もう一つのレコード。重複レコードの列に基づいてレコードの列を更新

+0

あなたが既に試したことを示してください – noscreenname

答えて

0

MySQLでは、同じテーブルのデータも取得するUPDATEを使用できないため、他のデータのコピーをテンポラリテーブルに作成する必要があります(まったく別の方法でこれを実行してください) 。

したがって、このような何か:

CREATE TEMPORARY TABLE duplicate_ids AS (
    SELECT card_number, id 
    FROM the_table AS t1 
    INNER JOIN the_table AS t2 ON (t1.card_number = t2.card_number and t2.id > t1.id) 
    WHERE t1.id = '0000' 
); 

UPDATE the_table 
INNER JOIN duplicate_ids ON the_table.card_number = duplicate_ids.card_number 
SET the_table.id = duplicate_ids.id; 

おそらくあなたがトランザクション内でこれを行うと思います。

データベーススキーマを制御できる場合は、このような重複が発生する可能性を排除する必要があります。あなたのテーブルには、同じカード番号の複数のインスタンスを持つことができますが、IDはどこでも同じことになっている場合は、2つのテーブルが必要です

  1. あなたが今持っているものを、しかし、ID列なし
  2. だけ(card_number, ID)

その後、あなたはID番号を必要とする任意のクエリでは、あなたがJOINと、他のテーブルからそれを得ることができますを持つ新しいテーブル。この方法では、同じカードのファイルに2つの異なる番号を付けることは全く不可能です。カードに複数のレコードがある場合でも、その番号を記録する場所は1つだけです。

0

私はこれを行うだろう:

update t join 
     (select t.cardnum, max(b) as maxb 
     from t 
     group by t.cardnum 
     having count(distinct b) > 1 
     ) tt 
     on t.cardnum = tt.cardnum 
    set t.b = tt.maxb 
    where t.b <> tt.maxb; 

サブクエリは、置換値を取得します。 having句は実際の重複があることを確認します。

関連する問題