和一个新问题:)
我设法通过更多选择和循环进行选择。 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可以将表连接到最多一个其他表” 如果我不使用LEFT JOIN并且只加入它可以工作,但我没有得到我想要的所有。我需要获得所有销售订单,即使他们没有分配交货订单。有没有办法做到这一点,还是我真的要分开我的选择?
答案 0 :(得分:1)
您可以尝试以下选择:
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.
我无法测试结果,但语法检查说:ok。
只有一个微小的差异:
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
。
答案 1 :(得分:1)
我在SAP中注意到,简化select语句并为不参与数据选择的表继续使用LOOP和SELECT SINGLE更有效。
在您的情况下,可以在选择数据后获取表VBFA中的数据(它不限制从数据库中提取的数据量)。
当然它取决于索引,应用程序服务器缓冲......但是,尽管对SQL专家来说可能是违反直觉的,但在SAP中保持选择语句不太复杂是最好的。
答案 2 :(得分:0)
我不知道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。希望它有效
答案 3 :(得分:-1)
尝试更改左连接的on子句中的表字段的顺序。把vbap~vbeln = vbfa~vbelv