2012-04-12 74 views
0

和一个新问题:)选择更多字段在一个选择abap sap

我设法做更多的选择和循环的选择。 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并且只加入它的作品,但我没有得到所有我想要的。即使他们没有分配交货订单,我也需要获得所有的销售订单。有没有办法做到这一点,还是我真的不得不拆分我的选择?

回答

1

我在SAP注意到,简化select语句并对不参与数据选择的表进行LOOP和SELECT SINGLE更有效。

对于您的情况,表VBFA中的数据可能在数据选择后获取(它不限制从数据库中获取的数据量)。

当然,这取决于索引,应用程序服务器缓冲...但是,即使它可能是SQL专家的反直觉,保持SAP中select语句不太复杂是最好的。

+0

Thx,我知道这是更好的解决方案,但我很好奇,如果它可能在这样一个巨大的选择。我只是在测试:)我用3个较小的选项和'For all entries'声明做了它:D和一个循环,所以我可以统一表格。 – kookies 2012-05-08 14:55:58

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。希望工程

+0

好的thx,我会试试这个。我认为这是支持的,但是对数据库处理来说是一个压倒性的选择,如果我没有弄错,请使用select。 – kookies 2012-04-12 06:40:56

+0

取决于你如何过滤以及你把过滤器放在哪里。其他方面,它可以更快,然后非派生查询 – Deb 2012-04-12 06:46:13

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~vbelvvbak~vbeln,我vbap~vbeln做到这一点。两者具有相同的值,但在on条款中,您再次使用vbap

+0

是的,我知道我已经尝试过一些东西,但没有奏效。 :)它以任何方式给出相同的回应。是的,我知道,创建一个连接但使用不同的字段是不对的,而不是形成我在连接中使用的表。 – kookies 2012-05-08 14:54:41

-1

尝试更改左连接的on子句中的表字段的顺序。把vbap〜vbeln = vbfa〜vbelv

+0

为什么downvote? – 2012-10-02 16:43:43