左外连接不 select 所有设备通知

Left outer join does not select all equipment notifs

我想要select所有有相关信息的通知,我也想要没有设备的通知。但是当我使用 below join 时,我只会得到设备不为空的那些。左外连接不应该确保我得到 table VIQMEL 中的所有内容吗?

如果删除 AND K~SPRAS EQ 'E',我会收到没有设备的通知。

关于如何解决这个问题有什么想法吗?

     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, 
            ax~pltxt, 
            fx~pltxt, 
            v~priok, 
            v~erdat, 
            s~tdid, 
            a~reltype, 
            z~aduser
  FROM viqmel AS v
  LEFT OUTER JOIN iflot     AS f  ON v~tplnr       = f~tplnr
  LEFT OUTER JOIN jest      AS j  ON j~objnr       = v~objnr
  LEFT OUTER JOIN tj02t     AS t  ON t~istat       = j~stat
  LEFT OUTER JOIN iflotx    AS fx ON fx~tplnr      = v~tplnr
  LEFT OUTER JOIN iflotx    AS ax ON ax~tplnr      = v~btpln
  LEFT OUTER JOIN qpct      AS ct ON ct~code       = v~qmcod
  LEFT OUTER JOIN eqkt      AS k  ON v~equnr       = k~equnr
  LEFT OUTER JOIN qpgt      AS gt ON gt~codegruppe = v~qmgrp
  LEFT OUTER JOIN stxh      AS s  ON s~tdname      = v~qmnum
  LEFT OUTER JOIN srgbtbrel AS a  ON v~qmnum       = a~instid_a
  LEFT OUTER JOIN zzid_map  AS Z  ON v~qmnam       = z~sapuser
  WHERE t~spras = @sy-langu
    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 <> @abap_true
    AND t~istat <> 'I0076'
    AND t~spras = 'E'
    AND fx~spras = 'E'
    AND k~spras = 'E'
   INTO TABLE @DATA(et_notifs).

旁注:EQKT 是设备短文本(不是设备),EQKT~SPRAS 是语言。 问题: 您只将条件写入 select 英文文本,这就是为什么 它会忽略与非英文或非英文连接的记录完全加入.

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

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

加入来自 table 的短信后,像这样加入

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

过滤后剩下

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

解决方案

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

由于 SAP Open SQL 的限制,无法排除连接,以及基于其他 table 中缺少相应记录而包含记录的连接。 excluding join的解决办法一般都是子查询

您可以添加子查询以根据您的过滤器检查 select 语言,并在其他情况下忽略该过滤器(包括空记录)。尝试将 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 个子查询。其中之一使用肯定检查 include 您需要的所有语言。另一个使用否定检查并包括不存在该特定语言的记录。


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

在清醒地看了你的问题后,我注意到我的解决方案可能对你的需求来说太复杂了(尽管它会起作用)。

键 + 条件的标准左连接将满足您的要求。将您的 and K~SPRAS EQ 'E' 移动到连接条件中,它将 select 完全按照您想要的方式进行(标准左连接)。另外,如果我没记错的话 outer 关键字对 left/right 连接没有任何作用。

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

PS:问题中的别名和冗余连接无助于提高其可读性。