数据的联查

经常会碰到大数据情况,这时候大多会采用分表的形式进行数据存储。这些表中有几个特点:

 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);

这样就可以将需要的数据联查出来了。

不过通常不这么做的因为本身一张表数据特别大,这样执行耗费的时间很长的,根据自己情况来用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值