在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视图。
- 选择显示的一行,然后单击标题工具栏中视图名称旁边的箭头(请参见上图)。
提示:或者,您可以右键单击条目,然后选择关注关联。
- 从可用关联列表中选择一个关联。
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”“关联<…>会影响结果集的基数”。
3.公开联想的语法
在前面的示例中,视图直接访问关联数据源的字段。这种关联称为临时关联。
当查看暴露的关联时,关联的好处变得更加明显。
CDS视图可以将关联名称本身放在其元素列表中,而不是访问关联数据源的各个字段。然后,将关联暴露给CDS视图的使用者,该消费者可以是另一个CDS视图或ABAP Open SQL语句。视图的使用者可以完全访问关联数据源的所有组件。
公开关联有一个先决条件:在关联的“打开”条件下使用的所有字段都必须是元素列表的一部分。在上面的示例中,字段c.carrid是暴露关联_carrier所必需的。暴露关联_flights需要字段c.carrid和c.connid。
- 首先,通过公开关联,您不会预先选择您认为可能感兴趣的数据源字段。您可以将此任务委托给视图的使用者。但是,如果消费者选择不从关联中选择任何字段,则存在重要的技术差异,这将变得很重要。
- 上面的示例显示了具有公开关联的CDS视图的SQL创建语句。您可以看到,在公开关联的情况下,SQL View不会立即加入关联的数据源。直到使用者实际访问关联数据源的各个字段,才可以完成数据源的实际联接。
- 您可以这样说:通过公开一个关联,数据源的实际连接被推迟,直到明确消费者真正想要从关联的数据源中查看数据为止。
- 因此,您可以在视图中添加任意数量的公开关联,而不必担心您可能会使用怪物连接表达式创建SQL f。
注意:由于联接尚未完成,因此,如果公开了最大基数大于1的关联,则没有语法警告。
4.CDS DDL中的路径表达
- 上例中的CDS视图从包含公开关联的CDS视图读取数据。
- 元素列表包含一个路径表达式,用于从关联_carrier的关联目标中读取字段carrname。
- 不直接使用Association _flights。而是传播它,这意味着它再次以相同的名称公开。
- 在此视图的SQL创建语句中,我们找到为CDS视图S4d430_Association_Exposed与数据库表SCARR创建的SQL视图的联接。这是因为SCARR是关联_carrier的目标。
- 此处未连接表SFLIGHT(关联_flights的目标)。这是因为不使用关联,而是仅公开关联。
注意:要定义此视图,不必知道SCARR是关联_carrier的目标。也不必知道连接和载体之间的关系的详细信息,即连接条件。
- 本示例中的CDS视图从上一示例的CDS视图中读取。
- 元素列表包含一个路径表达式,用于从关联_flights的关联目标读取字段seatocc。
- 在此视图的SQL创建语句中,我们找到为CDS视图S4d430_Path_Expressions_1创建的SQL视图与表SFLIGHT(关联_flights的目标)的联接。