SAP常见查询组合
做SAP开发的,SELECT是必不可少的。新语法出了不少'新鲜'的语法,用法也是五花八门。
新语法有新语法的好处,老语法有老语法的优势。
新语法里把很多的逻辑处理,分组,排重,内表处理全都放到一些关键字来处理。看起来是简化了代码,方便开发处理数据,但是缺少了必要的数据处理的思维逻辑,让人变得傻了。
SAP作为企业ERP中最大的BOSS,一直以来都不是以美观和高科技赢得口碑。作为一个使用者来说,ERP最理想的样子就是稳定,快捷,准确等。
在我看来,ERP是千万量级,亿级,十亿级,百亿级的数据处理,效率最高的才是最好的。
下面开始说说一些常见的SQL样例:
1,单独的select
一些简单的select是最基础的了。
SELECT result
FROM source
[[FOR ALL ENTRIES IN itab] WHERE sql_cond]
[GROUP BY group] [HAVING group_cond]
[ORDER BY sort_key]
INTO|APPENDING target
[additions].
...
[ENDSELECT].
这是SAP的F1说明,emmm...首先这个select endselect不建议使用了。select table的时候就对应好into table。select...endselect是单条处理,多次IO交互。
SAP给的建议是少次数的数据库IO处理,短时间的数据库IO。
[GROUP BY group] [HAVING group_cond] 这个稍微常用点,在分组或者取聚集数据的时候可以加。
比如:查询MSEG中各移动类型的数量,加个Group by就可以直接取。例子如下(因为不是ECC系统,所以借其他表演示):
SELECTA~PROCESS_TYPE
A~STAT_USER
sum( ZAF_PRICE ) as ZAF_PRICE
INTO CORRESPONDING FIELDS OF TABLE GT_ORDER
FROM ZHSB_ORDER_INDEX AS A
INNER JOIN CRMD_ORDERADM_H AS B
ON A~GUID = B~GUID
WHERE (GT_WHERE)
AND A~SALES_ORG IN S_ORG
AND A~PROCESS_TYPE = P_TYPE
AND B~CHANGED_AT BETWEEN GV_FROM AND GV_TO
GROUP BY a~PROCESS_TYPE a~STAT_USER.
这里就可以直接查询某些条件组合下的合计值。
2.关联查询:
常用INNER JOIN,LEFT OUT JOIN 等。
SELECT - JOIN
Syntax
... [(] {data_source [AS tabalias]}|join
{[INNER] JOIN}|{LEFT|RIGHT [OUTER] JOIN}
{data_source [AS tabalias]}|join ON join_cond [)] ... .
Addition:
... ON join_cond
Effect
Joins the columns of two or more database tables in a results set in a join expression. A join expression links a left side to a right side, using either [INNER] JOIN or LEFT|RIGHT [OUTER] JOIN. A join expression can be an inner join (INNER) or an outer join (LEFT OUTER) or RIGHT OUTER) join. Every join expression must contain a join condition join_cond after ON (see below). The following applies to entries specified on the left side and on the right side:
LEFT和RIGHT是以谁为主的差别。上面的例子中已经有了INNER JOIN,下面再添加个文本的LEFT JOIN如下:
SELECT A~PROCESS_TYPE
A~STAT_USER
C~P_DESCRIPTION
sum( ZAF_PRICE ) as ZAF_PRICE
INTO CORRESPONDING FIELDS OF TABLE GT_ORDER
FROM ZHSB_ORDER_INDEX AS A
INNER JOIN CRMD_ORDERADM_H AS B
ON A~GUID = B~GUID
LEFT JOIN CRMC_PROC_TYPE_T AS C
ON A~PROCESS_TYPE = C~PROCESS_TYPE
WHERE (GT_WHERE)
AND A~SALES_ORG IN S_ORG
AND A~PROCESS_TYPE = P_TYPE
AND B~CHANGED_AT BETWEEN GV_FROM AND GV_TO
GROUP BY a~PROCESS_TYPE a~STAT_USER C~P_DESCRIPTION.
注意*:LEFT JOIN里的字段不可以当作查询条件。(上面的WHERE CLUSE里不能有 C~字段)。
管理查询中还有个是
FOR ALL ENTRIES IN
很多人都不喜欢这个,觉得这个效率低,还没有INNER JOIN省事。^_^看怎么用吧,不要一竿子打死一船人。
SAP给的解释自己看F1,这里就不多说了,我说个用这个提效的例子:还是上面的LEFT JOIN。
SAP的JOIN是表之间的关联,当主表的数据量达到一定数量级,不管JOIN的是不是文本表,都会加重负担,比如说上面的SLECT中是先GROUP再取C表的描述还是先JOIN再取描述,然后一起GROUP呢?。
这时候怎么取文本表效率高,速度快呢?因为上面的SELECT已经有GROUP了,查出的结果内表数量可想而知很少很少。
注*:这里以及下面说的文本表不是具体指文本表,而是代指关联辅表。
这时候用FOR ALL ENTRIES IN来查文本表数据,然后循环loop处理,效率就上来了。
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_order
FROM CRMC_PROC_TYPE_T
FOR ALL ENTRIES IN gt_order
WHERE PROCESS_TYPE = gt_order-PROCESS_TYPE.
在主表后面再加个文本表,用用FOR ALL ENTRIES IN也就顺理成章了。
注意*:如果文本表本身数据量并不多,那么甚至还可以省略这个FOE ALL ENTRIES IN,直接取个全表也是可以的,这时候效率几乎相当的。
3.层级查询:
在一些复杂条件的查询中,很难去处理到底怎么查询才是最优的。下面列几个表,顺便说明其中的关系:
BUT000:BP主表
BUT020:BP地址关系主表
ADRC:地址主表
ADR2:电话主表
ADR3:FAX
ADR6:邮箱
(注*这几个表,关系相对明确,很多时候比这更麻烦)
如果这时候要按电话号码来查找BP,那么能想到的就是从ADR2->BUT020->BUT000
如果这时候是按BP来查,那么就是BUT000->BUT020->ADR2,ADRC...
如果按邮箱,邮编又是另外的情况了。
那么这时候怎么查询呢?一个select肯定不能完全解决问题的,不仅效率不能让人满意,结果也不一样就是想要的。
这时候分层级查询就很好的处理这种情况了。
设定LEVEL1,2,3等等。
REPORT zlytest112. TABLES:but000,but020,adrc,adr2,adr3,adr6. DATA:lv_level TYPE c. SELECTION-SCREEN:BEGIN OF BLOCK blk01 WITH FRAME TITLE text-.
SELECT-OPTIONS:
s_part FOR but000-partner,
s_name FOR but000-name1_text,
s_grop FOR but000-group,
s_rego FOR adrc-region,
s_tel FOR adr2-tel_number,
s_fax FOR adr3-fax_number,
s_emil FOR adr6-smtp_addr.
SELECTION-SCREEN END OF BLOCK blk01. START-OF-SELECTION.
"设置分级条件
IF s_tel IS NOT INITIAL OR s_fax IS NOT INITIAL OR s_emil.
lv_level = ''.
ENDIF. IF s_part IS NOT INITIAL OR s_name IS NOT INITIAL OR s_grop IS NOT INITIAL.
lv_level = ''.
ENDIF. IF s_rego IS NOT INITIAL.
lv_level = ''.
ENDIF. CASE lv_level.
WHEN ''.
PERFORM SEL_BUT000.
PERFORM FOA_ADRC.
PERFORM FOA_ADR2.
PERFORM FOA_ADR3.
PERFORM FOA_ADR6.
WHEN ''.
PERFORM SEL_ADRC.
PERFORM FOR_BUT000.
PERFORM FOA_ADR2.
PERFORM FOA_ADR3.
PERFORM FOA_ADR6.
WHEN ''.
PERFORM SEL_ADRX.
PERFORM FOR_BUT000.
PERFORM FOA_ADRX.
PERFORM FOA_ADRX.
PERFORM FOA_ADRX.
WHEN OTHERS.
ENDCASE.
具体的FORM里的代码就省了。这里是强关联关系,所以可以用一个SELECT就能替换调,但是效率就差了千万倍了。如果是弱关联,那么就不是一个SELECT能解决的事了。
SAP常见查询组合的更多相关文章
- elasticsearch 常见查询及聚合的JAVA API
ES 常见查询 (1)根据ID 进行单个查询 GetResponse response = client.prepareGet("accounts", "person&q ...
- 高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- 英语发音规则---I字母常见发音组合有哪些
英语发音规则---I字母常见发音组合有哪些 一.总结 一句话总结: I/y在开音节中发/aɪ/,例如:bite /baɪt/ n. 咬 I/y在闭音节中发 /ɪ/,例如:clinic /'klɪnɪk ...
- Moon.Orm 常见查询实例
一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...
- ABAP 常见查询问题解决方法
在ABAP 编程的时候会遇到查询单条语句的时候数能取对 但是条目数多了的话 会出现数不准确的问题 原因可能出现在查询使用了二分法查询方式 二分法查询下必须按排序的字段排序 还得按照排序的字段 ...
- PDMS二次开发之PML开发一些常见查询语句
1.查找session 以及session number var !DBname DBname !db = object db(!DBname) !session = !db.lastsession( ...
- SAP中查询用户操作日志的事务码
事务码:STAD 注意:查询的时间跨度范围不要太大,否则会很慢! 事务码:ST03N 工作负载和性能统计
- 常见概率组合题目总结quickstart
[本文链接] http://www.cnblogs.com/hellogiser/p/interview-questions-quickstart-for-combination-permutatio ...
- oracle 常见查询题
查询比本部门平均薪水高的员工信息 解法一: select d.deptno,e.empno,e.ename,e.sal,d.avgsal from emp e, (select deptno,avg( ...
随机推荐
- 第七周scrum会议
本周会议地点依旧 会议照片: 本周内容: 讨论了进行中的难点 我们正在分析图书馆首页的网页结构以及各种跳转的请求以及链接,为爬虫的实现奠定基础. flask框架我们也遇到了很多问题,正在进行官方文档的 ...
- pikachu SQL-Injection
1.数字型注入(POST) 可以看到,这个参数提交是POST类型的,用burp. 测试参数id id='&submit=%E6%9F%A5%E8%AF%A2 可以看到有报错回显,而且根据回显可 ...
- windows上传文件到 linux的hdfs
一.windows上传文件到 linux的hdfs 1.先在 centos 上开启 hdfs, 用 jps 可以看到下面信息, 说明完成开启 2.在win上配置 hadoop (https://www ...
- JDOJ 1152 是否是素数
1152: 是否是素数 https://neooj.com:8082/oldoj/problem.php?id=1152 题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. ...
- CSP2019&&AFO
day-1 attack回来了,颓废,吃蛋糕. day-0 和attack继续车上颓废. 报道,志愿者胖乎乎的,学校很新. day-1 T1写完写T2,两小时T310分 出来发现,T2好像有个地方没路 ...
- Sentinel: 使用注解限流
在前面我们对Sentinel做了一个详细的介绍,可以手动的通过Sentinel提供的SphU类来保护资源.这种做法不好的地方在于每个需要限制的地方都得写代码,从 0.1.1 版本开始,Sentinel ...
- loj 6051 「雅礼集训 2017 Day11」PATH - 多项式 - 钩子公式
题目传送门 传送门 设 $m = \sum_{i = 1}^{n} a_i$. 总方案数显然等于 $\frac{m!}{\prod_{i = 1}^{n} a_i!}$. 考虑这样一个网格图,第 $i ...
- 别傻傻不知道 == 和 equals 的区别【面试系列】
关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本类型比较,equals 是对象比较,不懂 hashCode,想起来简 ...
- 可以获取随机图片的API收集 必应 等
食用方法可以是img标签嵌入在网页中, 也可以在iwall.app里面设置你的桌面背景.还有其他好用的API吗? 请在下放留下您的评论. 非常感谢! 速度: ★★★★★ 功能: 返回Bing的随机图片 ...
- 在Visual Studio中新增生成项目
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构