BC490_UNIT5_Accessing Multiple Tables

在ABAP 中,有很多方式去实现JOIN操作:nested SELECTS,SELECT FOR ALL ENTRIES, DB view, ABAP JOINS, SUBQUERIES, EXPLICIT CURSOR.

如果你想让数据库系统定义JOIN操作的结果集,你要使用DB views, ABPA JOINS or subqueries.

 

INNER JOIN                   

  • Nested  Selects     嵌套的select
  • Logical Databases  逻辑数据库
  • For ALL Entries(Processing logic) 
  • Database view    数据库视图
  • Abap Jion
  • (Sbuquery)

LEFT OUTER JOIN

  • Nested  Selects
  • Logical Databases
  • For ALL Entries(Processing logic)
  • ABAP Join
  • (Subquery)

P_117:访问多张表的方式:

JOINS能用不同的方式实现。方法之一是: 把数据记录从外表读到一个 SELECT loop 中,在loop中, 一个进一步的select 语句是嵌套语句,在那里信息从内表被读取。这样就能实现INNER JOIN 或者 OUTER JOIN.

可以使用  SELECT FOR ALL ENTRIES来代替 嵌套的select,但是这只是用于小数量的数据,并且有可能出现问题。

P_118: 访问多张表--概览

最灵活并且被经常使用的用来执行JOINs的方式是在数据库水平上的。 在OPEN SQL 中, 你可以使用subqueries , database views, and ABAP JOINs. 只用INNER JOIN 实现了一个数据库视图。ABAP JOINS被用来执行INNER JOINS 和 LEFT OUTER JOINS.

P_119:内连接和外连接

从结果集可以推导出是INNER JOINS 和 LEFT OUTER JOINS。 内连接执行的结果集仅仅包含外表和内表匹配的条件的记录。左外连接是包含所有的记录,不管是否匹配。如果在内表中没有匹配的记录,将以空值返回到内表中。 在结果集中空值是被对应类型的初始值代替,所以在ABAP 中, IS INITIAL 是被查询的。

P_121: 嵌套查询的缺点

嵌套查询的问题:

低效率的传输: 1,内表中的数据被逐行的传输到驱动表

        2,许多小的取回,没有紧凑的取回

在同一个值上选择:

内表中的数据记录被多倍的读取。(WHERE语句在内表和驱动表之间工作,一个使用了关键字段,一个没有关键字段)

定义访问顺序: 一个表是一个内表还是外表被定义在代码里。

P_122:嵌套的selects

下面的例子是内连接:ABAP 中区分内连接还是左外连接是通过APPEND TO 目标表是 内部的还是外部的SELECT...ENDSELECT。

嵌套的select的主要缺点是: 传输话费的时间长。

另外一点缺点是: 同一个SQL语句被执行多次。

第三点缺点: 访问的顺序在代码中是固定的。

P_124:数据库视图

数据库视图是被存储在被用来定义数据库视图的表里,因此,定义一个数据库视图不会导致额外的加载。

不能通过数据库视图定义一个索引。使用数据库视图的SQL 语句总是被当成一个内连接执行。

如果各式各样的SQL 语句使用了数据库视图, 那么DB SQL 缓存执行的更加高效。

4.0版本之前,使用数据库视图的SQL 语句总是绕过SAP 表缓存,但是在这版本这后,数据库视图的内容能被缓存到应用服务器上。

 P_128:ABAP 内连接

ABAP JOINs 也绕过了SAP表缓存,要想在一个缓存表上的实现JOIN,最好在表上定义一个缓存数据库视图。

如果使用括号,ABAP JOIN 能连接多张表。但是不要连接太多张表,因为这样增加了在数据库上处理SQL 语句的复杂性。

P_129: ABAP 外连接

 

P_132: 视图和连接的优点

连接技术的优点是捆绑数据结果,并从数据库返回到应用服务器上,途径网络

 

使用SELECT...FOR ALL ENTRIES 可能会出现以下问题:

1,不能有空的驱动表

2,在select for all entries 被执行之前,复制表条目必须从驱动表中被删除。

3,根据SAP声明的指定数据库,参数 rsdb/max_blocking_factor必须被实现。

如果你想要读取大量的数据列,应该在异常的情况使用SELECT FOR ALL ENTRIES.

 

posted on 2016-06-07 07:51  刘君俭  阅读(119)  评论(0)    收藏  举报

导航