CDS视图中Associations的使用

在CDS中,Associations主要用连接多表,同时也可以使用 JOIN ,LEFT JOIN ,LEFT OUTER JOIN 等,在这里主要介绍Associations连接表的用法及相关说明。

1.关联语法:

  • CDS为处理实体(可以是表,也可以是视图,CDS等)之间的关系提供了扩展连接支持。这种关系通常在数据库中反映为外键关系。
  • Associations关联的语法使数据模型实体之间的关系保持可见。连接表达式和过滤的关联使读取CDS视图定义以及访问视图的SELECT语句更加容易方便面。

1.1.联接语法的使用

  • 关联定义关系(它们不仅连接数据源)
  • 关联在数据库级别转换为联接

1.2.更容易阅读

  • 关联可能包含其他语义信息(例如关系对应关系,1对1,1对多等)
  • 路径表达式揭示了基础数据模型和数据来源
  • 过滤条件比WHERE条件或CASE表达式更易于阅读,其实这里我也没搞懂为什么CDS中条件写在这里会比WHRE更易阅读,我更觉得过虑条件写在WHRE中才是更容易阅读。

1.3.性能提升

仅在需要时评估暴露的关联(“按需加入”)

尽管关联( associations)和联接(JOIN)看起来有所不同,但是数据库级别没有任何区别。最终,任何关联都转换为普通联接。但是在所谓的公开关联的情况下,它取决于视图的使用方式。仅当使用者从关联的数据源请求数据时才执行联接。

从来看是不是说, associations 与JOIN的性能是一样的呢??

1.3.1.模板定义关联视图

CDS视图中Associations的使用 - 第1张  | 优通SAP
关联的CDS视图
CDS视图中Associations的使用 - 第2张  | 优通SAP
数据预览结果
  • 在数据预览中打开CDS视图。
  • 选择显示的一行,然后单击标题工具栏中视图名称旁边的箭头(请参见上图)。

提示:或者,您可以右键单击条目,然后选择关注关联。

  • 从可用关联列表中选择一个关联。

2.关联和基数:

基数是可选的

默认基数为[0..1],

最小值是可选的

  • 最小值的默认值为0
  • [1]表示[0..1]
  • [4]表示[0..4]
  • [*]表示[0 .. *]

禁止值

  • 最小值不能为*
  • 最大值不能为0

语法检查最大值> 1

  • 关联不能在WHERE条件下使用(语法错误)
  • 关联不应该在聚合表达式之外使用(语法警告)

上面的列表显示了一些有关关联中基数的规则。有一些简短的形式和默认值。并且有一些禁止的值。

指定最大值大于1的基数(比如 *,0:*)会导致以下语法错误和警告:如下图

  • 发出语法错误“Value-set associations are not allowed here”“此处不允许使用值集关联”,原因是该关联在WHERE条件下使用。
  • 如果在元素列表中使用了关联,则会发出语法警告“Association <…> can influence the cardinality of the resulting set”“关联<…>会影响结果集的基数”。
CDS视图中Associations的使用 - 第3张  | 优通SAP
基数的语法警告[*]

3.公开联想的语法

在前面的示例中,视图直接访问关联数据源的字段。这种关联称为临时关联。

当查看暴露的关联时,关联的好处变得更加明显。

CDS视图中Associations的使用 - 第4张  | 优通SAP
暴露的关联示例

CDS视图可以将关联名称本身放在其元素列表中,而不是访问关联数据源的各个字段。然后,将关联暴露给CDS视图的使用者,该消费者可以是另一个CDS视图或ABAP Open SQL语句。视图的使用者可以完全访问关联数据源的所有组件。

公开关联有一个先决条件:在关联的“打开”条件下使用的所有字段都必须是元素列表的一部分。在上面的示例中,字段c.carrid是暴露关联_carrier所必需的。暴露关联_flights需要字段c.carrid和c.connid。

CDS视图中Associations的使用 - 第5张  | 优通SAP
公开和临时关联之间的区别
  • 首先,通过公开关联,您不会预先选择您认为可能感兴趣的数据源字段。您可以将此任务委托给视图的使用者。但是,如果消费者选择不从关联中选择任何字段,则存在重要的技术差异,这将变得很重要。
  • 上面的示例显示了具有公开关联的CDS视图的SQL创建语句。您可以看到,在公开关联的情况下,SQL View不会立即加入关联的数据源。直到使用者实际访问关联数据源的各个字段,才可以完成数据源的实际联接。
  • 您可以这样说:通过公开一个关联,数据源的实际连接被推迟,直到明确消费者真正想要从关联的数据源中查看数据为止。
  • 因此,您可以在视图中添加任意数量的公开关联,而不必担心您可能会使用怪物连接表达式创建SQL f。

注意:由于联接尚未完成,因此,如果公开了最大基数大于1的关联,则没有语法警告。

4.CDS DDL中的路径表达

CDS视图中Associations的使用 - 第6张  | 优通SAP
在视图定义中使用暴露的关联
  • 上例中的CDS视图从包含公开关联的CDS视图读取数据。
  • 元素列表包含一个路径表达式,用于从关联_carrier的关联目标中读取字段carrname。
  • 不直接使用Association _flights。而是传播它,这意味着它再次以相同的名称公开。
  • 在此视图的SQL创建语句中,我们找到为CD​​S视图S4d430_Association_Exposed与数据库表SCARR创建的SQL视图的联接。这是因为SCARR是关联_carrier的目标。
  • 此处未连接表SFLIGHT(关联_flights的目标)。这是因为不使用关联,而是仅公开关联。

注意:要定义此视图,不必知道SCARR是关联_carrier的目标。也不必知道连接和载体之间的关系的详细信息,即连接条件。

CDS视图中Associations的使用 - 第7张  | 优通SAP
associations 在新消费对像中的使用
  • 本示例中的CDS视图从上一示例的CDS视图中读取。
  • 元素列表包含一个路径表达式,用于从关联_flights的关联目标读取字段seatocc。
  • 在此视图的SQL创建语句中,我们找到为CD​​S视图S4d430_Path_Expressions_1创建的SQL视图与表SFLIGHT(关联_flights的目标)的联接。