首页 > 解决方案 > 左外连接不选择所有设备通知

问题描述

我想选择所有带有相关信息的通知,我也想要没有设备的通知。但是当我使用下面的连接时,我只会得到设备不为空的那些。左外连接不应该确保我得到表 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).

标签: abapopensqlsap-erp

解决方案


旁注: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:问题中的别名和冗余连接无助于其可读性。


推荐阅读