
136、组合查询和子查询新写法先说说昨天半夜那通电话。客户月结报表卡了三个小时没出来,日志里全是一条条“DBSQL_FOR_ALL_ENTRIES_IMPORTANT”,熟悉的味道。打开代码一看,果然是老前辈用FOR ALL ENTRIES从内表抽数据,一张百万级的内表,在数据量上来之后就变成了噩梦。当时急着救火,我直接把那段逻辑改成了组合查询加子查询,SQL从几十行缩到三五行,跑完只要四十秒。今天把这个过程总结一下,给也被FOR ALL ENTRIES坑过的朋友一些新思路。先说组合查询。ABAP里能用的标准SQL组合操作有UNION和UNION ALL,老版本里费劲拼内表再排序去重的场景,现在可以直接交给数据库。举个例子,要同时查两个航班表,一个是直飞航线SPFLI,一个是航班排期SFLIGHT,要求合并出承运公司和航班号。常规写法是先分别SELECT,然后拼内表,再用SORT DELETE ADJACENT DUPLICATES去重。新写法是:SELECT carrid, connid FROM spfliUNIONSELECT carrid, connid FROM sflightINTO TABLE @DATA(lt_flights).这里注意UNION默认去重,UNION ALL保留所有行。如果明确知道两条记录不会重复,用UNION ALL,数据库少做一次排序合并,性能更好。UNION后面不能跟括号,每个SELECT的字段个数和类型要一致,排序字段名右边没有——别在UNION后面写ORDER BY,要排序就包一层子查询。踩过的坑:UNION各成员里如果某个字段为空,数据库会按NULL处理,去重时把NU