ABAP CDS view 里 Inner Join,Left Outer Join 和 Right Outer Join 区别

举报
汪子熙 发表于 2023/08/07 11:56:28 2023/08/07
【摘要】 下图给出了 ABAP CDS view Inner Join 和 Outer Join 的语法区别。ABAP CDS (Core Data Services) 是一个用于定义和消费 ABAP 服务器应用程序的语义数据模型的持久性数据层。它允许你在应用程序服务器上定义基于 SQL 的视图,从而可以在 ABAP 代码中使用这些视图。在 SQL 中,JOIN 语句用于将两个或多个表的行组合在一起,...

下图给出了 ABAP CDS view Inner Join 和 Outer Join 的语法区别。

ABAP CDS (Core Data Services) 是一个用于定义和消费 ABAP 服务器应用程序的语义数据模型的持久性数据层。它允许你在应用程序服务器上定义基于 SQL 的视图,从而可以在 ABAP 代码中使用这些视图。

在 SQL 中,JOIN 语句用于将两个或多个表的行组合在一起,基于这些表之间的共同字段之间的关系。在 ABAP CDS 中,有三种主要的 JOIN 类型:Inner JoinLeft Outer Join,和 Right Outer Join。它们的区别主要在于如何处理两个表中没有匹配的记录。

  1. Inner JoinInner Join 仅返回两个表中有匹配的记录。如果存在任何没有匹配的记录,那么结果集中不会包含这些记录。例如,如果你有两个表,一个是员工表,另一个是部门表。如果你想找出所有有部门的员工,你可以使用 Inner Join 这两个表。

例子:

@AbapCatalog.sqlViewName: 'EMP_DEPT'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Employee and Department'
define view Emp_And_Dept as select from s_emp as Employee 
inner join s_dept as Department on Employee.dept_id = Department.id {
    Employee.id,
    Employee.name,
    Department.dept_name
}

在这个例子中,这个视图只会返回那些在员工表和部门表中都有记录的员工。换句话说,如果某个员工没有部门,那么这个员工就不会出现在结果集中。

  1. Left Outer JoinLeft Outer Join 返回左表的所有记录,以及右表中与左表有匹配的记录。如果右表中没有匹配的记录,则结果集中将包含左表的所有记录,但右表的所有字段将为 NULL。使用上述员工和部门的例子,如果你想找出所有员工,无论他们是否有部门,你可以使用 Left Outer Join

例子:

@AbapCatalog.sqlViewName: 'EMP_DEPT_ALL'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'All Employees and their Departments'
define view Emp_And_Dept_All as select from s_emp as Employee 
left outer join s_dept as Department on Employee.dept_id = Department.id {
    Employee.id,
    Employee.name,
    Department.dept_name
}

在这个例子中,这个视图会返回所有员工,无论他们是否有部门。如果某个员工没有部门,那么这个员工的部门名称将为 NULL。

  1. Right Outer JoinRight Outer Join 返回右表的所有记录,以及左表中与右表有匹配的记录。如果左表中没有匹配的记录,则结果集中将包含右表的所有记录,但左表的所有字段将为 NULL。继续使用上述的员工和部门的例子,如果你想找出所有部门,无论它们是否有员工,则使用右连接来实现这个功能。

再单独看一个右连接的例子。

假设我们有两个表:‘Orders’ 和 ‘Customers’。

表 ‘Customers’ 的结构如下:

Customers
+----+-------+
| ID | Name  |
+----+-------+
|  1 | John  |
|  2 | Jane  |
|  3 | Alice |
|  4 | Bob   |
+----+-------+

表 ‘Orders’ 的结构如下:

Orders
+-----+---------+
| ID  | OrderNo |
+-----+---------+
|  1  | 123     |
|  2  | 456     |
|  5  | 789     |
+-----+---------+

我们可以使用右连接 (Right Outer Join) 来合并这两个表。这会返回 ‘Orders’ 表中所有的记录,以及 ‘Customers’ 表中与之匹配的记录。如果在 ‘Customers’ 表中没有匹配的记录,结果将为 NULL。

SQL查询如下:

SELECT Customers.ID, Customers.Name, Orders.OrderNo
FROM Customers
RIGHT JOIN Orders
ON Customers.ID = Orders.ID;

查询结果如下:

+-----+-------+---------+
| ID  | Name  | OrderNo |
+-----+-------+---------+
|  1  | John  | 123     |
|  2  | Jane  | 456     |
| NULL| NULL  | 789     |
+-----+-------+---------+

在这个例子中,‘OrderNo’ 为 ‘789’ 的订单没有与之匹配的客户,所以 ‘ID’ 和 ‘Name’ 列的值为 NULL。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。