1,语法
abap语言中的SQL支持子查询(subquery),也就是在主查询SQL的where条件中再使用一个select查询语句对主查询的结果进行过滤。
语法:
| 
					 1 2 3 4 5 6 7 8  | 
						语法 ... EXISTS subquery ...  效果  This expression can be created using any subquery. It is true if the results set of the subquery contains at least one row.  | 
					
2,效率
先说结果吧,exists效率还不错,可以用一下的。
之前都是使用for all entries,印象里SQL语句where中写一些“奇奇怪怪”的东西的效率都不会太高,现在简单写两个程序测试一下,
程序1,使用exists抽取被冲销的物料凭证,代码:
| 
					 1 2 3 4 5 6 7 8 9  | 
						REPORT ytest_exist_sql. DATA:lt_mseg TYPE STANDARD TABLE OF mseg. SELECT *   FROM mseg   INTO TABLE lt_mseg  WHERE EXISTS ( SELECT * FROM m_mbmps WHERE smbln = mseg~mblnr                                         AND sjahr = mseg~mjahr                                         AND smblp = mseg~zeile ).  | 
					
程序2,不使用exists,而是用for all entries代替,代码:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						REPORT ytest_exist_sql2. DATA:lt_mseg   TYPE STANDARD TABLE OF mseg WITH HEADER LINE,      lt_mseg_2 TYPE STANDARD TABLE OF mseg WITH HEADER LINE. SELECT *   FROM mseg   INTO TABLE lt_mseg   . SELECT *   INTO TABLE lt_mseg_2   FROM mseg    FOR ALL ENTRIES IN lt_mseg  WHERE smbln = lt_mseg-mblnr    AND sjahr = lt_mseg-mjahr    AND smblp = lt_mseg-zeile.  | 
					
使用SAT看一下哪个程序效率高一些,
使用exists,38542微秒
使用for all entires 则运行了1225225微秒,
结果竟然是exists快了3倍左右。。。。for all entires慢!!!
以上。



发表评论