根据重复记录的列更新记录列

时间:2016-08-04 14:19:40

标签: mysql sql

我需要在表格中找到基于列A的重复行,这些行具有列B的不同数据。然后我需要更新列B,使其具有相同的数据,基于>比零数据。如果一个记录的列B = 0000,而另一个记录的列B = 1234,则将第一个记录列B更新为1234.查找具有相同卡号的记录#,如果其中一个记录的ID为零,则更新它以匹配另一条记录。

2 个答案:

答案 0 :(得分: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应该在任何地方都相同,则需要两个表:

  1. 您现在拥有的,但没有ID列
  2. 只有(card_number, ID)
  3. 的新表格

    然后,在您需要ID号的任何查询中,您可以使用JOIN从其他表中获取ID号。这样,完全不可能在同一张卡上存档两个不同的号码;即使该卡有多个记录,也只有一个记录该号码的地方。

答案 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子句确保实际重复。