问题描述
TYPES: BEGIN OF ty_table,matnr TYPE marc-matnr,prodh TYPE mvke-prodh,END OF ty_table.
DATA: bukrs TYPE mvke-vkorg,matnr TYPE marc-matnr.
DATA gt_table TYPE TABLE OF ty_table.
SELECT-OPTIONS s_bukrs FOR bukrs.
SELECT-OPTIONS s_matnr FOR matnr.
SELECT marc~matnr,mvke~prodh
FROM ( marc
LEFT OUTER JOIN mvke
ON mvke~matnr = marc~matnr )
INTO TABLE @gt_table[]
WHERE marc~matnr IN @s_matnr
AND mvke~vkorg IN @s_bukrs.
我想将 vkorg 条件放在 LEFT OUTER JOIN 中,但它不起作用:
SELECT marc~matnr,mvke~prodh
FROM ( marc
LEFT OUTER JOIN mvke
ON mvke~matnr = marc~matnr
AND mvke~vkorg IN @s_bukrs ) " <---
INTO TABLE @gt_table[]
WHERE marc~matnr IN @s_matnr.
这样做后,我收到以下错误:
"@S_BUKRS" is invalid here (due to grammar). contains an invalid character or it is a
如果我写 AND mvke~vkorg = @s_bukrs
它可以工作,但我需要使用 IN
。
解决方法
您只能在指定 JOIN 条件时使用运算符“=”。将您的条件添加到您的 WHERE 子句中。
SELECT *
FROM marc
INNER JOIN mara
ON mara~matnr = marc~matnr
LEFT OUTER JOIN mvke
ON mvke~matnr = marc~matnr
AND mvke~vtweg = @lv_vtweg
INTO TABLE @gt_table[]
WHERE marc~matnr IN @s_matnr
AND mvke~vkorg IN @s_bukrs.
,
我设法让它按照我想要的方式工作:
SELECT marc~matnr,mvke~prodh
FROM ( marc
LEFT OUTER JOIN mvke
ON mvke~matnr = marc~matnr )
INTO TABLE @gt_table[]
WHERE marc~matnr IN @s_matnr
AND ( mvke~vkorg IN @s_bukrs
OR mvke~vkorg IS NULL ). " <---
通过这种方式,它的作用类似于 LEFT OUTER JOIN,并且还会选择 MVKE 表中没有 PRODH 的 MATNR。
,您可以在此处找到用例的详细说明 sql-outer-join-overview-and-examples
我在这里添加上面链接的部分
SELECT *
FROM Employee
LEFT OUTER JOIN Departments ON Employee.EmpID = Departments.EmpID
我们需要注意Join语句中的表放置位置。目前,我们在左侧有一个 Employee 表,在右侧有一个 Departments 表。
让我们重写查询并交换查询中表的位置。在此查询中,我们将 Department 表放在左侧位置,因此 Left Outer Join 应检查此表的值并在不匹配的情况下返回 NULL 值。
在下面的屏幕截图中,您可以看到 EmpID 11 只有一个 NULL 值。这是因为 EmpID 11 在 Employee 表中不可用。