sql有点复杂,而且数据量很大大概1000w不知道怎么能写出效率比较高的sql呢?

Kyle-soft 2011-03-06 12:19:05
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,不处理

第三步:
删除第二条记录和第三条记录,保留第一条记录。
...全文
136 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
love19870803 2011-03-14
  • 打赏
  • 举报
回复
简单明了:select f1, max(f2), max(f3), max(f4) from tabA group by f1;
wwwwb 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zlyperson 的回复:]
感谢大家啊~其实只是一句话。

将某个字段一样的所有行,的其他字段,都互为填充。如果碰到
f1Va null f3Vb null
f1Va null f4Vb null
这种情况用f4Vb,替换,f3Vb或者用f3Vb替换f4Vb都行。
[/Quote]
如果是这样,MAX()就可以了
select f1, max(f2), max(f3), max(f4) from tabA group by f1;
Kyle-soft 2011-03-13
  • 打赏
  • 举报
回复
感谢大家啊~其实只是一句话。

将某个字段一样的所有行,的其他字段,都互为填充。如果碰到
f1Va null f3Vb null
f1Va null f4Vb null
这种情况用f4Vb,替换,f3Vb或者用f3Vb替换f4Vb都行。
Kyle-soft 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wwwwb 的回复:]

引用 4 楼 fcuandy 的回复:
都是投机取巧的, 楼主的三行数据只是例子

f1Va null null f4Va
f1Va null f3Vb null
f1Va null f4Vb null
f1Va f3Vc null null

这样的数据,第二行不要啦?

楼主说明一下这种情况怎么处理
[/Quote]
这样任意替换都可以了。f3Vb f4Vb 一定是一样的。
wwwwb 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fcuandy 的回复:]
都是投机取巧的, 楼主的三行数据只是例子

f1Va null null f4Va
f1Va null f3Vb null
f1Va null f4Vb null
f1Va f3Vc null null

这样的数据,第二行不要啦?
[/Quote]
楼主说明一下这种情况怎么处理
O溺水的鱼0 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fcuandy 的回复:]

都是投机取巧的, 楼主的三行数据只是例子

f1Va null null f4Va
f1Va null f3Vb null
f1Va null f4Vb null
f1Va f3Vc null null

这样的数据,第二行不要啦?
[/Quote]
就是
ACMAIN_CHM 2011-03-06
  • 打赏
  • 举报
回复
[Quote]楼上正解
select f1, max(f2), max(f3), max(f4) from tabA group by f1;[/Quote]这样就是直接最好的了。
fcuandy 2011-03-06
  • 打赏
  • 举报
回复
都是投机取巧的, 楼主的三行数据只是例子

f1Va null null f4Va
f1Va null f3Vb null
f1Va null f4Vb null
f1Va f3Vc null null

这样的数据,第二行不要啦?

老紫竹 2011-03-06
  • 打赏
  • 举报
回复
楼上正解
select f1, max(f2), max(f3), max(f4) from tabA group by f1;

多简单
iihero_ 2011-03-06
  • 打赏
  • 举报
回复
使用:
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: 0

mysql> 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了。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧