经常会碰到大数据情况,这时候大多会采用分表的形式进行数据存储。这些表中有几个特点:
1、表的数据结构完全一样;
2、表的名字大同小异;
某天接到需求,需要将这所有表中的数据进行汇总查询这时想到的方法:
利用union all 进行表的关联;
sql语句:
SELECT * FROM test WHERE a in(2542,2544,2546)
union all SELECT * FROM test1 WHERE a in(2542,2544,2546)
union all SELECT * FROM test2 WHERE a in(2542,2544,2546)
当时就郁闷了如果只是分了两三张 表可以用这种方法但我要联查的表有30多张总不能一直这样写吧!所以在网上就找了存储过程的写法
create procedure getdata(in start int,in end int)
begin
declare tmp int;
declare sqlstr text default '';
set tmp = start;
while tmp <= end do
if tmp = end then
set sqlstr = concat(sqlstr,'select * from test_',tmp,' WHERE a in (2542,2544,2546)');
else
set sqlstr = concat(sqlstr,'select * from test_',tmp,' WHERE a in (2542,2544,2546)',' union all');
end if;
set tmp = tmp + 1;
end while;
-- SELECT sqlstr;//查看sql语句
-- set @str = concat(sqlstr);
-- prepare stmt1 from @str;
-- execute stmt1;#执行
-- deallocate prepare stmt1;
end
CALL getcount(20130901,20130930);
这样就可以将需要的数据联查出来了。
不过通常不这么做的因为本身一张表数据特别大,这样执行耗费的时间很长的,根据自己情况来用。