拍摄于公园
原文地址:
https://www.ut163.com/fiori_learning_arrangement/sap-cds/how_to_use_join_in_cds/
CDS中JOIN的使用说明
外连接 Outer Joins
左外连接 Left Outer Join
右外连接 Right Outer Join
完全外部联接 Full Outer Join
嵌套联接Nested Joins
在CDS中,我们可以使用Associations,来关联表,也可以使用JOIN来关联表,在这里主要介绍JION相关的LEFT JION ,RIGHT OUTER JION ,CROSS JOIN的使用,关于Associations的使用说明可参看这里。
1.外连接 Outer Joins
此为SQL最简单也是最常见的联接类型。ABAP词典的经典数据库视图不支持此联接方式
![3e870e7272c95ab2e7219bf05387f59a.png](https://img-blog.csdnimg.cn/img_convert/3e870e7272c95ab2e7219bf05387f59a.png)
上图显示了一个内部联接:如果满足JOIN条件,则左表的一行和右表的一行将合并到一个公共结果行,也就是出来的结果,只会是两个表中都存在的行,不存在行不会出现在结果中。
2.左外连接 Left Outer Join
结果集可能包含左侧表的条目,而右侧表中的条目不匹配。
在经典的Open SQL中受支持
在左外部联接中,如果左表的一行和右表的一行满足JOIN条件(如内部联接),则将它们合并到公共结果行。
另外,将左表中与右表中不匹配的行复制到查询结果中。缺少的值(来自右表)用NULL值填充。
左外部联接确保左表中满足选择条件的任何条目在联接结果中至少出现一次
注意: 在Open SQL中使用CDS视图时,这些NULL值设置为类型友好的初始值。
![b696a9b5370cdf000dcfe16c58b3251b.png](https://img-blog.csdnimg.cn/img_convert/b696a9b5370cdf000dcfe16c58b3251b.png)
例子
![3e50a2cc13bd4d845848abadc4f94f6c.png](https://img-blog.csdnimg.cn/img_convert/3e50a2cc13bd4d845848abadc4f94f6c.png)
3.右外连接 Right Outer Join
集可能包含右表的条目,而左表中没有匹配的条目
在Open SQL(自NW 7.40 SP05起)和ABAP CDS中受支持
在右外部联接中,左表和右表的角色被交换:
右表中的行与左表中的不匹配行将被复制到查询结果中。缺少的值(从左表开始)用NULL值填充。
右外部联接可确保满足选择条件的右表的任何条目在联接结果中至少出现一次
![5f7b4c8db25f7b3fcd8e2badbd7f78ba.png](https://img-blog.csdnimg.cn/img_convert/5f7b4c8db25f7b3fcd8e2badbd7f78ba.png)
例子
![0382898dec7d3f0c68b5f28a9207076f.png](https://img-blog.csdnimg.cn/img_convert/0382898dec7d3f0c68b5f28a9207076f.png)
4.完全外部联接 Full Outer Join
注:(ABAP CDS不支持),目前,ABAP CDS视图不支持此功能。将来可能会支持。
结果集可能包含左侧表的条目,而右侧表中没有匹配的条目
结果集可能包含右侧表的条目,而左侧表中没有匹配的条目
Open SQL和ABAP CDS尚不支持
在完全外部联接中,两个表的处理方式相同。
将两个表中没有匹配的表的行复制到查询结果中。缺失值(来自另一张表)由NULL值填充。
在完全外部联接中,两个表的处理方式相同。
将两个表中没有匹配的表的行复制到查询结果中。缺失值(来自另一张表)由NULL值填充。
![e53d7578d9b80adc60e3e240fc1cc1c5.png](https://img-blog.csdnimg.cn/img_convert/e53d7578d9b80adc60e3e240fc1cc1c5.png)
注意: Open SQL或ABAP CDS尚不支持完全外部联接。解决方法是,可以使用左外部联接和右外部联接的UNION(请参阅下文)。
当使用CROSS JOIN连接两个数据源时,结果是这两个数据源的叉积:左侧的所有条目与右侧的所有条目组合在一起。结果集中的行数是左侧的行数乘以右侧的行数。不能为交叉连接指定连接条件。
注意:交叉连接的行为类似于内部或外部连接,其接通条件始终为true。具有WHERE条件的交叉联接与具有相同ON条件的内部联接具有相同的结果。与内部联接不同,在交叉联接中,在评估条件之前,首先读取所有数据。在内部联接中,仅读取满足ON条件的数据。
例:
![53325ffb09225326cd9e560df1961ed4.png](https://img-blog.csdnimg.cn/img_convert/53325ffb09225326cd9e560df1961ed4.png)
5.嵌套联接Nested Joins
显式(带括号)或隐式(无括号)
在CDS中,嵌套联接是可以没括号的,但推荐使用括号,这样代码更易于阅读,有括号时先执行括号时的,没括号时按如下顺序执行。
隐式执行顺序
内外连接:设置接通条件。
交叉连接:从左到右
CDS视图定义的from子句允许嵌套连接表达式。
您可以使用括号(方括号)来影响系统评估这些嵌套表达式的顺序。
对于内部联接和外部联接,通过on条件的排列。从左到右,最相邻的ON条件分配给每个联接,并且该表达式被隐式括在括号中。
交叉联接从左到右进行评估。
注意:如果将多个交叉联接组合在一起,则评估顺序无关紧要。结果始终是相同的,行数是所有涉及的数据源的行数的乘积。如果交叉联接与内部联接和外部联接相结合,则结果可能取决于求值顺序或括号。
![8111ad1c541f889fafa303f97dddc192.png](https://img-blog.csdnimg.cn/img_convert/8111ad1c541f889fafa303f97dddc192.png)
本示例读取有关票证计数器(表计数器)的信息。该信息与有关售票柜台所在的机场(餐桌机场)和运行柜台的承运人(餐桌吓人)的详细信息一起。
该示例使用外部联接,因为结果集还应该包括没有票务柜台的机场和完全不运行任何票务柜台的承运人。
不需要括号。但是,它们用于增加表达式的可读性。
![017d44dbfcfe4c91075f016bbd877771.png](https://img-blog.csdnimg.cn/img_convert/017d44dbfcfe4c91075f016bbd877771.png)
上图显示了相同的嵌套连接表达式,但是这次没有括号。这对结果没有影响。这两个联接的评估顺序完全相同。但是即使对于有经验的开发人员,乍一看,评估顺序也不会很明显。
注意: 使用嵌套联接定义视图时,请始终添加括号以提高可读性。
推荐阅读:
《ABAP新语法1》
《关于 SM30/VIEW_MAINTENANCE_CALL锁整张表问题》
《使用cl_gui_docking_container 实现多ALV》
《DEMO:S/4 1809 FAGLL03H 增加字段增强》
《几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了》
《SAP Parallel Accounting(平行分类账业务)配置+操作手册+BAPI demo程序》
《CC02修改确认日期BAPI:Processing of change number was canceled》《我是怎样调试BAPI的,以F-02为例》
《苏州游记》
《杂谈:几种接口》
《RESTful DEMO 一:SAP 如何提供 RESTful Web 服务》
《DEMO search help 增强 ( vl03n KO03 等)》
Debug 系列