2016-08-04 112 views
0

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

+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应该是到处都一样,你需要两个表:

  1. 你现在使用的一个,但没有ID列
  2. ,仅仅有(card_number, ID)

然后在您需要的ID号的任何查询新表,你可以用一个JOIN与其他表得到它。这种方式完全不可能在同一张卡上有两个不同的号码文件;即使卡上有多条记录,也只有一个地方可以记录该号码。

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子句确保有实际的重复项。