Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用一条ABAP SQL语句连接以下三个表_Abap_Opensql - Fatal编程技术网

如何使用一条ABAP SQL语句连接以下三个表

如何使用一条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用户

我有以下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用户
有记录

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
).
添加到
子句中并处理输出

  • 我计划在有时间的时候用解释来更新答案

要访问所有记录,应使用DB access,如下所示

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.