abap - 左外连接不选择所有设备通知
问题描述
我想选择所有带有相关信息的通知,我也想要没有设备的通知。但是当我使用下面的连接时,我只会得到设备不为空的那些。左外连接不应该确保我得到表 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
是语言。
问题:您编写的条件只选择英文文本,这就是为什么它忽略与非英语或根本没有连接的记录的原因。
所以如果你有(数字代表一个键)你的文本表
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:问题中的别名和冗余连接无助于其可读性。
推荐阅读
- visual-c++ - MSVC2017 编译器错误,Chromium 构建失败
- perl - 用 Perl 阅读和解释 crontab
- c# - 更新 HttpWebRequest 中的 api 时出现错误请求
- ionic-framework - 使用 Ionic core 4 时不会显示 ion-content
- apache2 - apache2 virtual 无法正常工作,重定向到 000-default.conf 位置
- regular-language - 如何显示常规语言等于另一种语言?
- html - 如何在我的容器中对齐引导导航栏
- php - 如何使用php替换文件中的字符串
- demandware - 我们如何从 SFCC(需求软件)获取最后访问的管道。
- python - 如何解决 Python Pandas DataFrame 的“超出纳秒时间戳”错误?