ABAP CDS view 里 Inner Join,Left Outer Join 和 Right Outer Join 区别
下图给出了 ABAP CDS view Inner Join 和 Outer Join 的语法区别。
ABAP CDS (Core Data Services) 是一个用于定义和消费 ABAP 服务器应用程序的语义数据模型的持久性数据层。它允许你在应用程序服务器上定义基于 SQL 的视图,从而可以在 ABAP 代码中使用这些视图。
在 SQL 中,JOIN 语句用于将两个或多个表的行组合在一起,基于这些表之间的共同字段之间的关系。在 ABAP CDS 中,有三种主要的 JOIN 类型:Inner Join
,Left Outer Join
,和 Right Outer Join
。它们的区别主要在于如何处理两个表中没有匹配的记录。
Inner Join
:Inner 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
}
在这个例子中,这个视图只会返回那些在员工表和部门表中都有记录的员工。换句话说,如果某个员工没有部门,那么这个员工就不会出现在结果集中。
Left Outer Join
:Left 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。
Right Outer Join
:Right 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。
- 点赞
- 收藏
- 关注作者
评论(0)