如何使用一条ABAP SQL语句连接以下三个表
我有以下3个数据表:如何使用一条ABAP SQL语句连接以下三个表,abap,opensql,Abap,Opensql,我有以下3个数据表: ZMYTABLE带列:ZUSER&ZTCODE和2条记录 elias VA01 elias VF01 elias SD_role elias SD2_role maria SD_role maria FI_role AGR_1251带记录 SD_role VA01 SD2_role VA01 SD3_role VA01 SD_role VA02 FI_role VF01 FI_role VF02 AGR\u用户
ZMYTABLE
带列:ZUSER
&ZTCODE
和2条记录
elias VA01
elias VF01
elias SD_role
elias SD2_role
maria SD_role
maria FI_role
AGR_1251
带记录
SD_role VA01
SD2_role VA01
SD3_role VA01
SD_role VA02
FI_role VF01
FI_role VF02
AGR\u用户
有记录
elias VA01
elias VF01
elias SD_role
elias SD2_role
maria SD_role
maria FI_role
我想显示字段ZUSER
,ZTCODE
和AGR\u NAME
我想要
ZMYTABLE
中的所有记录,其中包含存在特定用户的每个tcode的角色,即:
ZUSER---ZTCODE---AGRNAME
elias---VA01-----SD_role
elias---VA01-----SD2_role
elias---VF01-----
有人能告诉我,在ABAP V7.01 sp07中,如何用一条ABAP SQL语句连接3个表来实现这一点吗?DB access应该如下所示:
SELECT DISTINCT zmytable~zuser,
zmytable~ztcode,
agr_1251~agr_name
FROM zmytable
INNER JOIN agr_1251
ON agr_1251.ztcode EQ zmytable.ztcode
INNER JOIN agr_users
ON agr_users.zuser EQ zmytable.zuser
WHERE
agr_users.agr_name EQ agr_1251.agr_name OR EXISTS(
SELECT *
FROM agr_users AS inner_agr_users
INNER JOIN agr_1251 AS inner_agr_1251
ON inner_agr_1251.agr_name EQ inner_agr_users.agr_name
WHERE
inner_agr_users.agr_name EQ agr_1251.agr_name
).
将添加到
子句中并处理输出
- 我计划在有时间的时候用解释来更新答案
SELECT b~zuser, b~ztcode, a~agr_name
FROM agr_1251 as a
INNER JOIN zmytable as b
ON a~tcode EQ b~tcode
INNER JOIN agr_user as c
ON a~agr_name EQ c~agr_name.
Rest您可以使用ABAP显示输出。我发现使用
UNION
更容易,第一次选择将返回与某个用户角色(elias、VA01、SD_角色和SD2_角色)匹配的事务对应的行,第二个将返回与任何用户角色都不匹配的事务对应的行(elias,VF01)
我用USR07替换ZMYTABLE来测试它
SELECT usr07~bname, usr07~tcode, agr_1251~agr_name
FROM agr_users
INNER JOIN usr07
ON usr07~bname EQ agr_users~uname
INNER JOIN agr_1251
ON agr_1251~agr_name EQ agr_users~agr_name
AND agr_1251~low EQ usr07~tcode
UNION
SELECT DISTINCT usr07~bname, usr07~tcode, ' ' AS agr_name
FROM usr07
WHERE NOT EXISTS (
SELECT * FROM agr_users
INNER JOIN agr_1251
ON agr_1251~agr_name EQ agr_users~agr_name
WHERE usr07~bname EQ agr_users~uname
AND agr_1251~low EQ usr07~tcode )
INTO TABLE @DATA(result).
它给出了以下结果(针对ABAP单位格式化):
下面是ABAP单元测试代码,以演示它的工作原理,如果需要,您可以使用它。您需要ABAP7.52(开放式SQL测试双框架)
尝试1-B失败:
SELECT DISTINCT usr07~bname,
usr07~tcode,
agr_1251~agr_name
FROM usr07
INNER JOIN agr_1251
ON agr_1251~low EQ usr07~tcode
INNER JOIN agr_users
ON agr_users~uname EQ usr07~bname
WHERE
agr_users~agr_name EQ agr_1251~agr_name OR EXISTS (
SELECT *
FROM agr_users AS inner_agr_users
INNER JOIN agr_1251 AS inner_agr_1251
ON inner_agr_1251~agr_name EQ inner_agr_users~agr_name
WHERE
inner_agr_users~agr_name EQ agr_1251~agr_name
)
INTO TABLE @DATA(result).
SORT result BY bname tcode agr_name.
TYPES ty_result LIKE result.
assert_equals( act = result exp = VALUE ty_result(
( bname = 'elias' tcode = 'VA01' agr_name = 'SD2_role' )
( bname = 'elias' tcode = 'VA01' agr_name = 'SD_role' )
( bname = 'elias' tcode = 'VF01' agr_name = 'FI_role' ) ) ).
尝试2失败:
SELECT b~bname, b~tcode, a~agr_name
FROM agr_1251 as a
INNER JOIN usr07 as b
ON a~low EQ b~tcode
INNER JOIN agr_users as c
ON a~agr_name EQ c~agr_name
INTO TABLE @DATA(result).
SORT result BY bname tcode agr_name.
TYPES ty_result LIKE result.
assert_equals( act = result exp = VALUE ty_result(
( bname = 'elias' tcode = 'VA01' agr_name = 'SD2_role' )
( bname = 'elias' tcode = 'VA01' agr_name = 'SD_role' )
( bname = 'elias' tcode = 'VA01' agr_name = 'SD_role' )
( bname = 'elias' tcode = 'VF01' agr_name = 'FI_role' ) ) ).
三重连接适用于版本>7.4
SELECT c~zuser, a~zrole, c~ztcode INTO CORRESPONDING FIELDS OF TABLE @lt_result
FROM agr_users AS a INNER JOIN agr_1251 AS b
ON a~zrole = b~zrole
RIGHT OUTER JOIN zmytable AS c
ON c~ztcode = b~ztcode AND c~zuser = a~zuser.
你试过什么?你被困在哪里了?我无法得到我想要的结果。它只返回普通记录(前2条记录)。SCN上也有问题:桑德拉,在2个论坛上提问有问题吗?Thanks@ekekakos没问题。但是人们可能会找到有用的相关答案,如果在其他论坛中解决,它会避免回答,可能会提供一些附加信息,等等。如果我问两个在同一上下文中出现的问题,我个人会这样做。这会返回常见记录,即我示例中的前两个记录。Thanks@ekekakosfixedFor information,我已经在一个测试程序(cf separate answer)中测试了这个查询,它没有给出预期的结果。不幸的是,Dorad返回了正确的记录数,但是对于适当的记录,字段AGR_NAME不是空的。感谢EliasFor提供的信息,我已经在一个测试程序中测试了该查询(参见单独的答案),它没有给出预期的结果。Sandra,不幸的是,该系统是一个旧的ECC6 V7.01 sp07系统,因此没有UNION。无论如何,谢谢。对于这些较旧的系统,请使用2个SELECT,第二个带有
附加表的表,而不是附加到表中的表。我试图通过使用2个表来解决此问题,1个表包含常用记录(在我的示例中为前2个),另1个表包含所有正确的数字记录,但相应的AGR\U名称字段不为空。因此,我将循环到第二个表中,我将读取第一个表,其中包含所有3个字段。如果sy subrc 0,则我将清空记录的AGR_NAME字段。在我看来,这是一个糟糕的解决方案,但到目前为止还没有其他直接的解决方案。@ekekakos你在问一个问题,我给你一个我已经测试过的答案,它给出了你想要的确切结果(这是通过使用ABAP单元证明的,虽然需要7.52,所以我知道你不能执行它,但请相信我)。我还解释了如何在ABAP版本中替换UNION
。我不明白你为什么说你仍然没有解决方案。Sandra说我没有解决方案,我的意思是通过连接直接调用DB,而不是使用你或我的解决方案在DB中多次调用。我希望我能说清楚。豪杰,这是在版本>7.50下工作的,不是我们的7.01。谢谢,好的。答案已更新。它还应适用于7.01右外连接
仅适用于ABAP>=7.40。我已经编辑了这个问题,提到它是为ABAP 7.01准备的。@SandraRossi谢谢!我会在7点01分检查。
SELECT c~zuser, a~zrole, c~ztcode INTO CORRESPONDING FIELDS OF TABLE @lt_result
FROM agr_users AS a INNER JOIN agr_1251 AS b
ON a~zrole = b~zrole
RIGHT OUTER JOIN zmytable AS c
ON c~ztcode = b~ztcode AND c~zuser = a~zuser.