我想选择所有的通知与相关的信息,我也希望通知没有设备。但是当我使用下面的join时,我只得到设备不为空的那些。左边的外部联接不应该确保我得到表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).发布于 2018-05-29 13:32:10
备注:EQKT是设备短文本(非设备),EQKT~SPRAS是语言。问题:--您编写条件时只选择英文文本,这就是为什么忽略了与非英语或非英语连接的记录,而这些记录在中根本没有连接。
因此,如果您有(数字表示一个键)您的文本表
1 E ....
2 X ....
3 N ....
4 E ....表中的联接文本之后,如下所示
1 E ....
2 [initial]
3 [initial]
4 E ....过滤后,你会被留下
1 E ....
4 E ....解决方案
不必要的复杂解决方案,使用排除子查询
由于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')
) 这里的想法是您有两个子查询。其中一种方法是对进行正面检查,将包含在您需要的所有语言中。另一种方法使用否定检查,并包括不存在特定语言的记录。
更新:极简式解决方案(在键+条件下左加入)
在用清晰的头脑看了你的问题之后,我发现我的解决方案可能对你的需求来说太复杂了(尽管它会起作用)。
键+条件下的标准左连接将满足您的要求。将您的and K~SPRAS EQ 'E'移动到联接状态,它将选择您想要的方式(标准的左联接)。此外,如果我正确地回忆起,outer关键字不会对左/右联接执行任何操作。
LEFT JOIN EQKT AS K ON V~EQUNR EQ K~EQUNR AND K~SPRAS EQ 'E'PS:问题中的别名和冗余联接无助于它的可读性。
https://stackoverflow.com/questions/50581333
复制相似问题