左外连接不选择所有行

时间:2018-05-29 09:51:23

标签: abap

我想选择包含相关信息的所有通知,如下所示。我也想要没有设备的通知。但是当我使用以下连接时,我只得到设备不为空的那些。左外连接不应该确保我得到表VIQMEL中的所有内容吗?如果我删除“ AND K~SPRAS EQ'E'”,我会收到没有设备的通知。

有关如何解决此问题的任何想法?

LEFT OUTER JOIN EQKT as K ON V~EQUNR EQ K~EQUNR

  SELECT V~QMNUM, V~QMART, T~ISTAT, T~TXT30, V~AUFNR, V~TPLNR, V~EQUNR, V~BTPLN, V~QMNAM, V~QMGRP,
  V~QMCOD, CT~KURZTEXT, GT~KURZTEXT, V~BEBER, K~EQKTX, V~QMTXT, FX~PLTXT, AX~PLTXT, V~PRIOK, V~ERDAT, S~TDID, A~RELTYPE, Z~ADUSER
  FROM VIQMEL AS V
  LEFT OUTER JOIN IFLOT     AS F  ON V~TPLNR       EQ F~TPLNR
  LEFT OUTER JOIN JEST      AS J  ON J~OBJNR       EQ V~OBJNR
  LEFT OUTER JOIN TJ02T     AS T  ON T~ISTAT       EQ J~STAT
  LEFT OUTER JOIN IFLOTX    AS FX ON FX~TPLNR      EQ V~TPLNR
  LEFT OUTER JOIN IFLOTX    AS AX ON AX~TPLNR      EQ V~BTPLN
  LEFT OUTER JOIN QPCT      AS CT ON CT~CODE       EQ V~QMCOD
  LEFT OUTER JOIN EQKT      AS K  ON V~EQUNR       EQ K~EQUNR
  LEFT OUTER JOIN QPGT      AS GT ON GT~CODEGRUPPE EQ V~QMGRP
  LEFT OUTER JOIN STXH      AS S  ON S~TDNAME      EQ V~QMNUM
  LEFT OUTER JOIN SRGBTBREL AS A  ON V~QMNUM       EQ A~INSTID_A
  LEFT OUTER JOIN ZZID_MAP  AS Z  ON V~QMNAM       EQ Z~SAPUSER
  WHERE T~SPRAS EQ @IV_SPRAS
  AND V~QMNUM LIKE @P_QMNUM
  AND V~EQUNR LIKE @P_EQUNR
  AND V~QMNAM LIKE @P_QMNAM
  AND V~AUFNR LIKE @P_AUFNR
  AND F~TPLNR LIKE @P_TPLNR
  AND T~ISTAT LIKE @P_ISTAT
  AND V~BEBER LIKE @P_BEBER
  AND J~INACT NE @ABAP_TRUE
  AND T~ISTAT NE 'I0076'
  AND T~SPRAS EQ 'E'
  AND FX~SPRAS EQ 'E'
  AND K~SPRAS EQ 'E'
  INTO TABLE @ET_NOTIFS.

1 个答案:

答案 0 :(得分:2)

旁注:EQKT是设备短文本(不是设备),EQKT~SPRAS是语言。 问题:您写的条件只是选择英文文本,这就是为什么忽略与非英语或非英语联合的记录的原因

所以如果你有(数字代表一个键)你的文本表

1   E    ....
2   X    ....
3   N    ....
4   E    ....

从表连接加入文本之后

1   E    ....
2   [initial]
3   [initial] 
4   E    ....

过滤后,您将离开

1   E    ....
4   E    ....

解决方案

不必要的复杂解决方案,使用排除子查询

由于SAP Open SQL的限制,不包括联接,以及包含基于缺少其他表中相应记录的记录的联接是不可能的。 排除联接的解决方法通常是子查询。

您可以添加子查询以根据过滤器检查选择语言,并在其他情况下忽略该过滤器(包括空记录)。尝试用以下内容替换and K~SPRAS EQ 'E'(这里的想法是采用语言,如果它存在,否则绕过条件):

   and ( K~SPRAS in (select SPRAS from EQKT where EQUNR=V~EQUNR and spras = 'E') 
     OR NOT EXISTS (select SPRAS from EQKT where spras = 'E')
   ) 

这里的想法是你有2个子查询。其中一个使用肯定的检查来包括您需要的所有语言。另一个使用否定检查,并包括不存在该特定语言的记录。

更新:简约解决方案(关键+条件左连接)

在清楚地看着你的问题之后,我注意到我的解决方案可能太复杂,无法满足你的需求(即使它会起作用)。

关键+条件的标准左连接将满足您的要求。将and K~SPRAS EQ 'E'移动到连接条件,它将完全按照您希望的方式选择(标准左连接)。另外,如果我没记错,outer关键字在左/右连接上没有做任何事情。

  LEFT JOIN EQKT      AS K  ON V~EQUNR       EQ K~EQUNR AND K~SPRAS EQ 'E'

PS:问题中的别名和冗余连接并没有帮助它的可读性。