技术开发 频道

实例:多表嵌套查询的极限优化

    如果说抬头和对应的行项目不具有普遍性,那么继续,ekko表同样是一个sap表,我们要把符合条件(ekko-ebeln= lips-vgbel)的数据进行筛选。

    先为ekko定义包含其输出字段和匹配条件的内表,然后按屏幕条件选出数据填入此内表, 其中ebeln是ekko表的主键,按字段ebeln排序。ekko表的bukrs和ekorg字段是必输项。

    DATA: BEGIN OF wa_ekko_result,

    bukrs TYPE ekko-bukrs,

    ekorg TYPE ekko-ekorg,

    ebeln TYPE ekko-ebeln,

    END OF wa_ekko_result,

    it_ekko_result LIKE TABLE OF wa_ekko_result WITH HEADER LINE.

    SELECT bukrs ekorg ebeln

    FROM ekko

    INTO CORRESPONDING FIELDS OF TABLE it_ekko_result

    WHERE bukrs IN s_bukrs

    AND ekorg IN s_ekorg.

    SORT it_ekko_result BY ebeln.

    二.把表it_ekko_result数据按主键ebeln装入it_lips_result,特别注意:此次外循环表it_lips_result在没有匹配到的时候也要删除!因为ekko的字段bukrs和ekorg是必输项!

    DATA flag TYPE i VALUE 0.

    LOOP AT it_lips_result.

    LOOP AT it_ekko_result.

    IF it_ekko_result-ebeln = it_lips_result-vgbel.

    MOVE-CORRESPONDING it_ekko_result TO it_lips_result.

    MODIFY it_lips_result.

    flag = 1.

    EXIT.

    ELSEIF it_ekko_result-ebeln > it_lips_result-vgbel. "当内部循环表数值更大时跳到外部循环

    EXIT.

    ELSE.

    DELETE it_ekko_result.

    ENDIF.

    ENDLOOP.

    IF flag = 0.

    DELETE it_lips_result.

    ENDIF.

    flag = 0.

    ENDLOOP.

    这个就不是抬头与行项目的对应关系。我们可以这样想想:有两份扑克牌,先都从小到大排序。以其中一份牌为基准,另一份牌有相等的就取出,小了就丢弃,这两种情况继续取,如果大了则把基准牌丢弃翻下一张。这样只需要扑克牌总张数次比较即可。容易想象这个算法的复杂度显然为O(m+n)。

    如果关键字是联合主键一样可以,如:

    ELSEIF it_mseg_result-mblnr > it_big_result-vbeln

    OR ( it_mseg_result-mblnr = it_big_result-vbeln AND it_mseg_result-zeile > it_big_result-posnn ).

    EXIT.

    这个例子(mblnr, zeile)是联合主键。道理是相同的,按照排序从小到大依次比较。

    我相当于实现了 两表结合查询中,如果匹配条件涉及的关键字段是其中一个表的主键时,可以把查询性能优化到一阶。

    多表查询可以分拆为两表查询,我在作公司的一个报表程序中发现很多时候查询条件都得是其中一个表的主键,因此利用这个优化可以把程序的复杂度大大降低!

0
相关文章