由於最近要從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語句,也請大家積極跟帖,一同來完善我們的知識點。 當然大家有更好的辦法,也請寫在後的跟帖中,以達到在技術上的共同進步!!