tabA
filed1     filed2      filed3     filed4   
f1Va        null        null       f4Va
f1Va        null        f3Vb       null  
f1Va        f3Vc        null       null需求:
1、找出filed1内容相同
2、将任意一行null的字段,填上其他行,同列的非null的字段
3、保留填充完整的行,删除其他提供数据的行
上述数据希望返回:
filed1     filed2      filed3     filed4   
f1Va        f3Vc        f3Vb       f4Va解释:
第一步:找到filed1相同的内容,有三条
f1Va        null        null       f4Va
f1Va        null        f3Vb       null  
f1Va        f3Vc        null       null第二步:
第一条记录的filed2字段为null,找到第三条记录的filed2字段非空,然后用该字段填充第一行中filed2字段
第一条记录的filed3字段为null,找到第二条记录的filed2字段非空,然后用该字段填充第一行中filed3字段
第一条记录的filed4字段非null,不处理第三步:
删除第二条记录和第三条记录,保留第一条记录。

解决方案 »

  1.   

    使用:
     select f1, max(f2), max(f3), max(f4) from tabA group by f1;mysql> create table tabA(f1 varchar(4), f2 varchar(4), f3 varchar(4), f4 varchar(4));
    Query OK, 0 rows affected (0.13 sec)mysql> insert into tabA values('f1Va', null, null, 'f4Va');
    Query OK, 1 row affected (0.00 sec)mysql> insert into tabA values('f1Va', null, 'f3Vb', null);
    Query OK, 1 row affected (0.00 sec)mysql> insert into tabA values('f1Va', 'f3Vc', null, null);
    Query OK, 1 row affected (0.00 sec)mysql> select f1, max(f2), max(f3), max(f4) from tabA group by f1;
    +------+---------+---------+---------+
    | f1   | max(f2) | max(f3) | max(f4) |
    +------+---------+---------+---------+
    | f1Va | f3Vc    | f3Vb    | f4Va    |
    +------+---------+---------+---------+
    1 row in set (0.03 sec)mysql> create table tabAA as select f1, max(f2), max(f3), max(f4) from tabA group by f1;
    Query OK, 1 row affected (0.14 sec)
    Records: 1  Duplicates: 0  Warnings: 0mysql> select * from tabAA;
    +------+---------+---------+---------+
    | f1   | max(f2) | max(f3) | max(f4) |
    +------+---------+---------+---------+
    | f1Va | f3Vc    | f3Vb    | f4Va    |
    +------+---------+---------+---------+
    1 row in set (0.00 sec)
    mysql> alter table tabA rename to tabA2;
    Query OK, 0 rows affected (0.05 sec)mysql> alter table tabAA rename to tabA;
    Query OK, 0 rows affected (0.03 sec)这样你就能得到新的tabA了。
      

  2.   

    楼上正解
    select f1, max(f2), max(f3), max(f4) from tabA group by f1;多简单
      

  3.   

    都是投机取巧的, 楼主的三行数据只是例子f1Va null null f4Va
    f1Va null f3Vb null  
    f1Va null f4Vb null 
    f1Va f3Vc null null这样的数据,第二行不要啦?
      

  4.   

    这样任意替换都可以了。f3Vb f4Vb 一定是一样的。
      

  5.   

    感谢大家啊~其实只是一句话。将某个字段一样的所有行,的其他字段,都互为填充。如果碰到
    f1Va null f3Vb null
    f1Va null f4Vb null
    这种情况用f4Vb,替换,f3Vb或者用f3Vb替换f4Vb都行。
      

  6.   

    如果是这样,MAX()就可以了
    select f1, max(f2), max(f3), max(f4) from tabA group by f1;
      

  7.   

    简单明了:select f1, max(f2), max(f3), max(f4) from tabA group by f1;