Left Outer Join未筛选全部无设备通知问题求助
解决左外连接丢失无设备通知的问题
我来帮你搞定这个问题——你遇到的是左外连接里一个非常常见的坑:把关联表的过滤条件放在了WHERE子句里,导致左外连接变成了内连接的效果。
为什么会丢数据?
当你用LEFT OUTER JOIN关联EQKT表时,对于那些没有设备(equnr为空)的通知,EQKT表是没有匹配行的,所以k~spras字段的值是NULL。而你把k~spras = 'E'放在WHERE子句里时,数据库会自动过滤掉所有k~spras为NULL的行——这就把那些无设备的通知给排除了,完全违背了左外连接要保留主表所有数据的初衷。
同样的问题也出现在fx~spras = 'E'和t~spras = 'E'这些条件上,它们都会过滤掉主表中没有对应关联数据的行。
修正后的SQL代码
解决方法很简单:把针对关联表的过滤条件从WHERE子句移到对应的JOIN ON条件里。这样只会在关联的时候筛选匹配的行,不会影响主表VIQMEL的所有数据返回。
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 AND t~spras = @sy-langu AND t~istat <> 'I0076' LEFT OUTER JOIN iflotx AS fx ON fx~tplnr = v~tplnr AND fx~spras = 'E' 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 AND k~spras = 'E' 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 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 INTO TABLE @DATA(et_notifs).
关键调整说明
eqkt表的语言条件:把k~spras = 'E'移到LEFT OUTER JOIN eqkt AS k的ON条件中,这样没有设备的通知不会被过滤,只是k~eqktx会是NULL。iflotx表的语言条件:同样把fx~spras = 'E'移到对应的JOIN ON条件里,避免丢失没有对应功能位置文本的通知。tj02t表的过滤条件:把t~spras = @sy-langu和t~istat <> 'I0076'也移到JOIN ON中,防止因为jest没有匹配状态而丢失通知。
这样修改后,VIQMEL的所有通知都会被保留,包括无设备的那些,同时关联表只会返回符合语言和过滤条件的匹配数据,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Matthijs Mennens
相关产品推荐
相关产品推荐

