左外连接不 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:问题中的别名和冗余连接无助于提高其可读性。
我想要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:问题中的别名和冗余连接无助于提高其可读性。