ABAP,SQL,是否可以在单个查询中处理 N-M 关系?
ABAP, SQL, Is it possible to handle N-M relation in single query?
我还没有找到一种在 ABAP 中编写查询的方法,该查询将为我提供具有 N-M 关系的表中的数据。
ZTINTF_EMPASS 描述:
- emp_no - 员工编号
- pos_no - 员工职位编号
- start_date - 员工开始在当前职位工作的日期
问题描述:
- 每一对{emp_no,pos_no}都有独特的start_date
- 对于每个 emp_no,需要找到最大值 start_date 并返回相应的 pos_no
SQL 服务器可能的查询示例(with 子句包含仅用于模拟的数据):
with ztintf_empass (mandt, emp_no, pos_no, start_date) as (
select 100, '000000001001', 101, CONVERT(DATETIME, '01.07.2014', 102) union all
select 100, '000000001002', 102, CONVERT(DATETIME, '01.06.2014', 102) union all
select 100, '000000001003', 102, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001003', 103, CONVERT(DATETIME, '01.01.2010', 102) union all
select 100, '000000001004', 202, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001005', 201, CONVERT(DATETIME, '01.06.2016', 102) union all
select 100, '000000001005', 301, CONVERT(DATETIME, '01.05.2015', 102) union all
select 100, '000000001006', 401, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001006', 402, CONVERT(DATETIME, '01.09.2010', 102) union all
select 100, '000000001006', 403, CONVERT(DATETIME, '01.10.2015', 102) union all
select 100, '000000001006', 501, CONVERT(DATETIME, '01.03.2019', 102)
)
select a.emp_no
, pos_no
, a.start_date
from ztintf_empass a
inner join (
select emp_no
, max(start_date) start_date
from ztintf_empass
group by emp_no
) g on g.emp_no = a.emp_no
and g.start_date = a.start_date
;
我确实想在 ABAP 中通过单个查询获得准确的结果。
预期结果:
emp_no pos_no start_date
000000001001 101 01.07.2014
000000001002 102 01.06.2014
000000001003 103 01.01.2010
000000001004 202 01.01.2000
000000001005 201 01.06.2016
000000001006 501 01.03.2019
我在这上面花了一些时间但没有效果 - 有可能吗?
您认为数据之间的某些关系存在非常奇怪的限制,但 ABAP 对您的数据一无所知,因此它允许您在具有任何(可能没有)关系的表之间进行连接。 SELECT
的语法在 ABAP help 中可用。在这里你可以发现data_source
定义中没有子查询的位置。
解决方法是:
- CDS view 有更多 SQL 选项可用。您也可以创建聚合视图并将其用作数据源。
- 对于 HANA,有 AMDP methods for classes,您可以在其中为 HANA 数据库编写任何有效的 SQL 脚本代码。在这里,您在方法定义中声明了 DDIC 对象,因此 where-used 列表将向您显示存储库中对象的使用情况。您还可以调用非 ABAP 对象,在 DBMS 中可用,带有模式前缀标识符:
schema.object
.
CL_SQL_STATEMENT
class,您可以在其中为您的数据库编写任何有效的 SQL 语句。但是,当然,没有 SQL 语法检查或任何使用的功能。
我还没有找到一种在 ABAP 中编写查询的方法,该查询将为我提供具有 N-M 关系的表中的数据。
ZTINTF_EMPASS 描述:
- emp_no - 员工编号
- pos_no - 员工职位编号
- start_date - 员工开始在当前职位工作的日期
问题描述:
- 每一对{emp_no,pos_no}都有独特的start_date
- 对于每个 emp_no,需要找到最大值 start_date 并返回相应的 pos_no
SQL 服务器可能的查询示例(with 子句包含仅用于模拟的数据):
with ztintf_empass (mandt, emp_no, pos_no, start_date) as (
select 100, '000000001001', 101, CONVERT(DATETIME, '01.07.2014', 102) union all
select 100, '000000001002', 102, CONVERT(DATETIME, '01.06.2014', 102) union all
select 100, '000000001003', 102, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001003', 103, CONVERT(DATETIME, '01.01.2010', 102) union all
select 100, '000000001004', 202, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001005', 201, CONVERT(DATETIME, '01.06.2016', 102) union all
select 100, '000000001005', 301, CONVERT(DATETIME, '01.05.2015', 102) union all
select 100, '000000001006', 401, CONVERT(DATETIME, '01.01.2000', 102) union all
select 100, '000000001006', 402, CONVERT(DATETIME, '01.09.2010', 102) union all
select 100, '000000001006', 403, CONVERT(DATETIME, '01.10.2015', 102) union all
select 100, '000000001006', 501, CONVERT(DATETIME, '01.03.2019', 102)
)
select a.emp_no
, pos_no
, a.start_date
from ztintf_empass a
inner join (
select emp_no
, max(start_date) start_date
from ztintf_empass
group by emp_no
) g on g.emp_no = a.emp_no
and g.start_date = a.start_date
;
我确实想在 ABAP 中通过单个查询获得准确的结果。
预期结果:
emp_no pos_no start_date
000000001001 101 01.07.2014
000000001002 102 01.06.2014
000000001003 103 01.01.2010
000000001004 202 01.01.2000
000000001005 201 01.06.2016
000000001006 501 01.03.2019
我在这上面花了一些时间但没有效果 - 有可能吗?
您认为数据之间的某些关系存在非常奇怪的限制,但 ABAP 对您的数据一无所知,因此它允许您在具有任何(可能没有)关系的表之间进行连接。 SELECT
的语法在 ABAP help 中可用。在这里你可以发现data_source
定义中没有子查询的位置。
解决方法是:
- CDS view 有更多 SQL 选项可用。您也可以创建聚合视图并将其用作数据源。
- 对于 HANA,有 AMDP methods for classes,您可以在其中为 HANA 数据库编写任何有效的 SQL 脚本代码。在这里,您在方法定义中声明了 DDIC 对象,因此 where-used 列表将向您显示存储库中对象的使用情况。您还可以调用非 ABAP 对象,在 DBMS 中可用,带有模式前缀标识符:
schema.object
. CL_SQL_STATEMENT
class,您可以在其中为您的数据库编写任何有效的 SQL 语句。但是,当然,没有 SQL 语法检查或任何使用的功能。