首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左侧外部连接没有选择所有设备通知。

左侧外部连接没有选择所有设备通知。
EN

Stack Overflow用户
提问于 2018-05-29 09:51:22
回答 1查看 1.9K关注 0票数 1

我想选择所有的通知与相关的信息,我也希望通知没有设备。但是当我使用下面的join时,我只得到设备不为空的那些。左边的外部联接不应该确保我得到表VIQMEL中的所有内容吗?

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

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

代码语言:javascript
复制
     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).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-29 13:32:10

备注:EQKT是设备短文本(非设备),EQKT~SPRAS是语言。问题:--您编写条件时只选择英文文本,这就是为什么忽略了与非英语或非英语连接的记录,而这些记录在中根本没有连接。

因此,如果您有(数字表示一个键)您的文本表

代码语言:javascript
复制
1   E    ....
2   X    ....
3   N    ....
4   E    ....

表中的联接文本之后,如下所示

代码语言:javascript
复制
1   E    ....
2   [initial]
3   [initial] 
4   E    ....

过滤后,你会被留下

代码语言:javascript
复制
1   E    ....
4   E    ....

解决方案

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

由于SQL的限制,不包括联接,也不可能包含基于其他表中没有相应记录的记录。排除联接的替代方法通常是子查询.

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

代码语言:javascript
复制
   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')
   ) 

这里的想法是您有两个子查询。其中一种方法是对进行正面检查,将包含在您需要的所有语言中。另一种方法使用否定检查,并包括不存在特定语言的记录。

更新:极简式解决方案(在键+条件下左加入)

在用清晰的头脑看了你的问题之后,我发现我的解决方案可能对你的需求来说太复杂了(尽管它会起作用)。

键+条件下的标准左连接将满足您的要求。将您的and K~SPRAS EQ 'E'移动到联接状态,它将选择您想要的方式(标准的左联接)。此外,如果我正确地回忆起,outer关键字不会对左/右联接执行任何操作。

代码语言:javascript
复制
  LEFT JOIN EQKT      AS K  ON V~EQUNR       EQ K~EQUNR AND K~SPRAS EQ 'E'

PS:问题中的别名和冗余联接无助于它的可读性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50581333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档