由于最近要从2个大表中A(几万条),B(几百万条记录)中查询其中的交集部分,用关联字段的关联查询,太慢,总结出另一个可以解决办法的比较高效语句,特拿来与大家分享,不多说了,下边详细介绍一下我的思路(我的需求是B表的排行,并从A中取部分显示字段信息,以便导出到EXCEL中浏览):
1、先从B表中查询出结果集写入临时表Temp中,
假语句:insert into temp(field1,field2,field3....) select field1,field2, sum(field3) as aa from 表B where 条件。。。 group by field1,field2
实例Eg:insert into sa_sale_order(barcode,sellprice1,sumqty) select a.tsxpluno,a.tsxpc,sum(tsxqty) as aa from sa_sale_ct a where (1=1) and '+SEARCH_STR +' group by a.tsxpluno,a.tsxpc ';
2、然后再通过比较 A与Temp相应的记录,同时更新Temp表中的其它字段(从A中取得)[A与Temp通过id关联],在此注明一下,用update来更新时,只能一条条的更新,不然会导致死机。
假语句:update Temp Set Field4=(select Field4 from 表A where Temp.id=表A.id)
实例Eg:update sa_sale_order a set goodsid=(select goodsid from hq_goods b where .barcode=b.barcode)';
update sa_sale_order a set goodsname=(select goodsname from hq_goods b where a.barcode=b.barcode)';
3、经过第2步的更新后,临时表中的数据字段都全赋了值后,即可查询出来 排序数据来,在些oracle中要用到ROWNUM来选用排序中的前、后N名。
假语句:select * from (select * from Temp order by desc/asc ) where ROWNUM<=100
实例Eg:select * from (select * from sa_sale_order order by sumqty '+order_str +' ) where ROWNUM<=100 其中Order_str是通过条件来传递的排序(DESC、ASC)
以上是本人从工作中总结出的一点知识,在此,如果大家如果有对第2步 进行数据更新,有更好的方法或SQL语句,也请大家积极跟帖,一同来完善我们的知识点。 当然大家有更好的办法,也请写在后的跟帖中,以达到在技术上的共同进步!!