ITPub博客

首页 > 应用开发 > IT综合 > SAP CDS view 里 Inner Join,Left Outer Join 和 Right Outer Join 的区别

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

原创 IT综合 作者:i042416 时间:2023-08-13 11:58:16 0 删除 编辑

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

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

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

  1. 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
}

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

  1. 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。

  1. 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.OrderNoFROM CustomersRIGHT JOIN OrdersON Customers.ID = Orders.ID;

查询结果如下:

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

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24475491/viewspace-2969971/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
测试

注册时间:2018-01-20

  • 博文量
    3822
  • 访问量
    1982001