在CDS中,可以使用Associations来连接多多,同时也能在其中进行筛选(Filtered)。
过滤的关联的语法
语法过滤的关联
- 可以使用过滤条件来扩展CDS DDL中的路径表达式。
- 当系统将路径表达式转换为数据库级别的联接时,过滤条件将成为ON条件的一部分,也就是说,可以在ON中写查询条件,相当于以前写在WHERE中的条件,可以使用在ON后面。
- 在此示例中,表tcurt与表scarr(航空公司的主数据)相关联。表tcurt是所谓的文本表。它包含许多不同语言的货币名称和描述。关联的“打开”条件定义了两个表之间的基本外键关系,即表scarr中的货币代码(字段currcode)链接到表tcurt中的关键字段was。
- 这种关联将一个承运人与其本国货币的所有描述相关联,而与语言无关。
- 该示例未在关联的ON条件中将选择限制为一种语言,而是在路径表达式中使用了过滤条件。从技术上讲,即在数据库上,结果是相同的。但是通过使用路径表达式中的过滤条件,可以更清楚地了解哪些条件是外键关系的一部分,以及哪些条件反映了附加选择。
1.Associations中可使用的运算符
- =,<,>,<=,> =,<>
左侧:
- 必须是关联对象字段
右侧:
- 关联对象领域字段
- 文字
- 参数
- 会话变量
实施过滤条件时,以下规则适用
- 允许所有关系运算符(=,<,>,<=,> =,<>)。
- 条件的左侧需要关联目标的字段(在我们的示例中为_currency的字段)。
- 右侧可以是该目标数据源的另一个字段,文字,参数或会话变量。
2.过滤关联Associations中的基数
- 上面的示例包含表TCURT与表SCARR的关联。此关联的正确基数为0 .. *:一个承运人的本地货币代码可以在表tcurt中包含任意数量的文本-每种维护的语言都可以有一个。
- 我们已经了解到,通常,一旦在路径表达式中使用了关联,基数*就会导致语法警告甚至错误。
- 在我们的示例中,过滤条件将关联的基数减小为“ 0..1”:对于给定的语言,每个货币代码TCURT最多包含一个条目。
- 要对此进行记录-并使语法警告和错误消失,可以在路径表达式的过滤条件中指定基数“ 1”。
注意:在没有过滤条件的情况下,不允许在路径表达式中指定基数。
3.注释比较过滤器Annotation Compare Filter
- 默认情况下,每个具有过滤条件的新路径表达式都将在生成的SQL视图中导致单独的联接。即使过滤条件相同,也会发生这种情况(请参见上面的示例和左侧的SQL CREATE语句)。
- ABAP批注“ AbapCatalog.compiler.compareFilter”可用于指定是否对视图的路径表达式比较过滤条件。如果过滤条件
- 匹配时,关联的联接表达式仅创建一次,通常可以提高性能。
注意:两种配置的结果集可能不同。
- 在上面的示例中,两个路径表达式中的过滤条件相同。
- 注释ABAPCatalog.compiler.compareFilter的值为false。这使得系统生成scarr和tcurt的两个单独的联接以检索字段ktext和Itext。值为true时,系统将比较过滤器,意识到它们是相同的,并且仅使用一个联接来检索两个字段。
注意:所有数据定义模板都包含注释ABAPCatalog.compiler.compareFilter,其值为true。