2012-04-12 253 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