ABAP 7.02中两个表的左连接

ABAP 7.02中两个表的左连接,abap,Abap,我想加入4个表T001、KNKK、KNB1和KNA1,以获取KNB1/KNA1中的所有客户及其在KNKK中的风险类别 我们需要KNKK的左连接,但连接条件基于两个表:T001-KKBER和KNA1-KUNR 但是我得到了语法错误: 无法与“T001~KKBER”进行比较。一个表最多可以使用左外部联接与另一个表联接 选择是: SELECT knb1~kunnr kna1~name1 kna1~lifnr knb1~akont INTO TABLE git_kunnr_tab

我想加入4个表T001、KNKK、KNB1和KNA1,以获取KNB1/KNA1中的所有客户及其在KNKK中的风险类别

我们需要KNKK的左连接,但连接条件基于两个表:T001-KKBER和KNA1-KUNR

但是我得到了语法错误:

无法与“T001~KKBER”进行比较。一个表最多可以使用左外部联接与另一个表联接

选择是:

SELECT knb1~kunnr kna1~name1 kna1~lifnr knb1~akont
       INTO TABLE git_kunnr_tab
       FROM kna1
       INNER JOIN knb1
       ON kna1~kunnr EQ knb1~kunnr
       INNER JOIN t001
       ON knb1~bukrs EQ t001~bukrs
       LEFT JOIN knkk
       ON knb1~kunnr EQ knkk~kunnr AND
          t001~kkber EQ knkk~kkber
       WHERE knb1~kunnr IN s_kunnr
          AND knb1~bukrs = p_bukrs.
我们的系统是旧的ECC6 7.02,因此无法实现ABAP的新功能


有没有办法在1选择中完成

不确定会出现什么错误,但这在语法上是正确的:

SELECT ...
       INTO TABLE ...
       FROM kna1
       INNER JOIN knb1
       ON kna1~kunnr EQ knb1~kunnr
       INNER JOIN t001
       ON knb1~bukrs EQ t001~bukrs
       LEFT JOIN knkk
       ON knb1~kunnr EQ knkk~kunnr AND
          t001~kkber EQ knkk~kkber
       WHERE ...

不确定会出现什么错误,但这在语法上是正确的:

SELECT ...
       INTO TABLE ...
       FROM kna1
       INNER JOIN knb1
       ON kna1~kunnr EQ knb1~kunnr
       INNER JOIN t001
       ON knb1~bukrs EQ t001~bukrs
       LEFT JOIN knkk
       ON knb1~kunnr EQ knkk~kunnr AND
          t001~kkber EQ knkk~kkber
       WHERE ...

我相信,即使KNK中不存在客户,也无法连接所有这些表并从KNA1中选择所有客户。
也许有一种方法可以使用子查询,但我现在无法思考某个问题。
因此,我进行了2次选择并填充了2个ITAB,然后我使用KUNNR和CTLPC循环到其中一个,并通过传递CTLPC值修改第二个ITAB。因此,代码现在是:

select knb1~kunnr kna1~name1 kna1~lifnr knb1~akont
           knb1~fdgrv knb1~frgrp 
          into table git_kunnr_tab
        from knb1 as knb1 left join kna1 as kna1
            on knb1~kunnr = kna1~kunnr
        where knb1~kunnr in s_kunnr
          and knb1~bukrs = p_bukrs.

select knkk~kunnr knkk~ctlpc into table lit_kunnr_risk
    from knkk as knkk inner join t001 as t001
        on knkk~kkber = t001~kkber
    where t001~bukrs = p_bukrs and
          knkk~ctlpc <> ''.

  sort git_kunnr_tab by kunnr.
  loop at lit_kunnr_risk into lwa_kunnr_risk.
    gwa_kunnr_tab-ctlpc = lwa_kunnr_risk-ctlpc.
    modify git_kunnr_tab from gwa_kunnr_tab transporting ctlpc
                         where kunnr = lwa_kunnr_risk-kunnr.
    clear gwa_kunnr_tab.
  endloop.
选择knb1~kunnr kna1~name1 kna1~lifnr knb1~akont
knb1~fdgrv knb1~frgrp
进入表git_kunnr_选项卡
从knb1作为knb1左连接kna1作为kna1
关于knb1~kunnr=kna1~kunnr
其中knb1~kunnr位于s_kunnr
knb1~bukrs=p_-bukrs。
选择knkk~KUNR knkk~ctlpc进入表lit\U KUNR\U risk
从knkk作为knkk内部接头t001作为t001
关于knkk~kkber=t001~kkber
其中t001~bukrs=p_bukrs和
knkk~ctlpc“”。
按kunnr对git_kunnr_选项卡进行排序。
将lit_kunnr_风险处的回路转换为lwa_kunnr_风险。
gwa_kunnr_tab-ctlpc=lwa_kunnr_risk-ctlpc。
从gwa_kunnr_选项卡到ctlpc修改git_kunnr_选项卡
其中kunnr=lwa_kunnr_risk-kunnr。
清除gwa_kunnr_选项卡。
结束循环。

如果有更好的方法,请发布

我认为,即使KNK中不存在客户,也无法连接所有这些表并从KNA1中选择所有客户。
也许有一种方法可以使用子查询,但我现在无法思考某个问题。
因此,我进行了2次选择并填充了2个ITAB,然后我使用KUNNR和CTLPC循环到其中一个,并通过传递CTLPC值修改第二个ITAB。因此,代码现在是:

select knb1~kunnr kna1~name1 kna1~lifnr knb1~akont
           knb1~fdgrv knb1~frgrp 
          into table git_kunnr_tab
        from knb1 as knb1 left join kna1 as kna1
            on knb1~kunnr = kna1~kunnr
        where knb1~kunnr in s_kunnr
          and knb1~bukrs = p_bukrs.

select knkk~kunnr knkk~ctlpc into table lit_kunnr_risk
    from knkk as knkk inner join t001 as t001
        on knkk~kkber = t001~kkber
    where t001~bukrs = p_bukrs and
          knkk~ctlpc <> ''.

  sort git_kunnr_tab by kunnr.
  loop at lit_kunnr_risk into lwa_kunnr_risk.
    gwa_kunnr_tab-ctlpc = lwa_kunnr_risk-ctlpc.
    modify git_kunnr_tab from gwa_kunnr_tab transporting ctlpc
                         where kunnr = lwa_kunnr_risk-kunnr.
    clear gwa_kunnr_tab.
  endloop.
选择knb1~kunnr kna1~name1 kna1~lifnr knb1~akont
knb1~fdgrv knb1~frgrp
进入表git_kunnr_选项卡
从knb1作为knb1左连接kna1作为kna1
关于knb1~kunnr=kna1~kunnr
其中knb1~kunnr位于s_kunnr
knb1~bukrs=p_-bukrs。
选择knkk~KUNR knkk~ctlpc进入表lit\U KUNR\U risk
从knkk作为knkk内部接头t001作为t001
关于knkk~kkber=t001~kkber
其中t001~bukrs=p_bukrs和
knkk~ctlpc“”。
按kunnr对git_kunnr_选项卡进行排序。
将lit_kunnr_风险处的回路转换为lwa_kunnr_风险。
gwa_kunnr_tab-ctlpc=lwa_kunnr_risk-ctlpc。
从gwa_kunnr_选项卡到ctlpc修改git_kunnr_选项卡
其中kunnr=lwa_kunnr_risk-kunnr。
清除gwa_kunnr_选项卡。
结束循环。


如果有更好的方法,请发布

您能为abapsql()提供语法错误吗?谢谢。您能尝试删除KNKK的一个连接条件并将其移动到WHERE条件吗?所以,在knb1~kunnr EQ knkk~kunnr上左连接knkk,其中。。。和t001~kkber EQ kkk~kkber。我这样做了,但我再次收到相同的错误消息。然后,您必须像您那样打断两条select语句……您能为ABAP SQL()提供语法错误吗?谢谢。您能尝试删除KNKK的一个连接条件并将其移动到WHERE条件吗?所以,在knb1~kunnr EQ knkk~kunnr上左连接knkk,其中。。。t001~kkber EQ kkber~kkber。我这样做了,但我再次收到相同的错误消息。然后,你必须像你那样打断两条select语句……这就是我试图做的。问题是SAP Open SQL不接受knb1~kunnr EQ knkk~kunnr和t001~kkber EQ knkk~kkber上的两个左联接表。至少是我们的ECC6版本。为什么要T001离开加入?T001条目(公司代码)必须存在,否则无法创建KNB1条目(公司代码中的客户)。我需要T001以获取KNKK的KKBER。我需要KNKK上的左连接。所以,我重复我的问题:为什么你们想要T001左连接而不是内连接?再次说明:T001条目始终存在,因此左连接没有意义。谁说T001是左连接,它是与KNB1的内部连接。KNKK是左连接,但我们必须用两个表KNA1和T001连接它。您的查询在7.4之前的旧ABAP中不起作用。这就是我试图做的。问题是SAP Open SQL不接受knb1~kunnr EQ knkk~kunnr和t001~kkber EQ knkk~kkber上的两个左联接表。至少是我们的ECC6版本。为什么要T001离开加入?T001条目(公司代码)必须存在,否则无法创建KNB1条目(公司代码中的客户)。我需要T001以获取KNKK的KKBER。我需要KNKK上的左连接。所以,我重复我的问题:为什么你们想要T001左连接而不是内连接?再次说明:T001条目始终存在,因此左连接没有意义。谁说T001是左连接,它是与KNB1的内部连接。KNKK是左连接,但我们必须用两个表KNA1和T001连接它。您的查询在7.4之前的旧ABAP中不起作用