我设法用更多的选择和一个循环进行选择。 4个表(最后一个仅用于收集所有数据)
但是现在我正在考虑一种方法,只需一个选择语句即可选择我需要的所有字段。这是巨大的选择:)
SELECT vbak~vbeln vbak~audat
tvakt~bezei
vbap~posnr vbap~matnr vbap~kwmeng vbap~vrkme
lips~vbeln lips~posnr lips~werks lips~lfimg
vbfa~vbtyp_n
FROM vbak JOIN vbap ON vbak~vbeln = vbap~vbeln
JOIN tvakt ON vbak~auart = tvakt~auart
LEFT JOIN vbfa ON vbfa~vbelv = vbak~vbeln AND vbfa~posnv = vbap~posnr
JOIN lips ON vbfa~vbeln = lips~vbeln AND vbfa~posnn = lips~posnr
INTO TABLE gt_salord
WHERE tvakt~spras = 'EN' AND
vbak~vbeln IN s_vbeln AND
vbak~audat IN s_audat.
问题是这行不通。当我尝试激活它时,会抛出此错误:"无法与"VBAP~POSNR"进行比较。一个表最多可以与另一个表连接,使用 LEFT OUTER JOIN"如果我不使用左加入,只有加入它可以工作,但我没有得到我想要的所有东西。我需要获取所有销售订单,即使他们没有分配交货订单。有没有办法做到这一点,或者我真的必须拆分我的选择?
我在SAP中注意到,简化选择语句并为不参与数据选择的表继续使用LOOP和SELECT SINGLE更有效。
在您的情况下,可以在选择数据后获取表 VBFA 中的数据(它不限制从数据库获取的数据量)。
当然这取决于索引、应用程序服务器缓冲...但是,即使对于 SQL 专家来说可能违反直觉,在 SAP 中保持选择语句不太复杂是最好的。
你能尝试以下选择吗:
SELECT vbak~vbeln vbak~audat
tvakt~bezei
vbap~posnr vbap~matnr vbap~kwmeng vbap~vrkme
lips~vbeln lips~posnr lips~werks lips~lfimg
vbfa~vbtyp_n
FROM vbak JOIN vbap ON vbak~vbeln = vbap~vbeln
JOIN tvakt ON vbak~auart = tvakt~auart
LEFT JOIN vbfa ON vbfa~vbelv = vbap~vbeln AND vbfa~posnv = vbap~posnr
JOIN lips ON vbfa~vbeln = lips~vbeln AND vbfa~posnn = lips~posnr
INTO TABLE gt_salord
WHERE tvakt~spras = 'EN' AND
vbak~vbeln IN s_vbeln AND
vbak~audat IN s_audat.
我无法测试结果,但语法检查说:好的。
只有一个微小的区别:
x---- difference
v
LEFT JOIN vbfa ON vbfa~vbelv = vbap~vbeln AND vbfa~posnv = vbap~posnr
LEFT JOIN vbfa ON vbfa~vbelv = vbak~vbeln AND vbfa~posnv = vbap~posnr
你把vbfa~vbelv
和vbak~vbeln
比起来,我用vbap~vbeln
来做。两者具有相同的值,但在 on
-子句中,您再次使用 vbap
。
我不知道 SAP Abap .但从 SQL 的角度来看,如果 SAP 支持派生查询,则可以使用派生查询。
这里有一些方法:
select * from
(
select * from
table1 inner join table2 on table1.key=table2.key
inner join table3 on table1.key=table3.key
) a left outer join table4 b
on a.key=b.key
将其作为问题发布标记为SQL。希望它有效
尝试更改左连接的 on 子句中表字段的顺序。把 vbap~vbeln = vbfa~vbelv