2012-04-12 41 views
0

と新しい問題:)1つの選択肢内でさらにフィールドを選択abap sap

多くの選択とループで選択を管理します。 4つのテーブル(最後のものはすべてのデータを収集するためだけだった) しかし、今私は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 = 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を使用してテーブルを最大1つの他のテーブルに結合することができます " LEFT JOINを使用せずJOINのみを使用する場合それは動作しますが、私はすべてのものを手に入れません。私は、配達注文が割り当てられていなくても、すべての営業注文を取得する必要があります。それを行う方法はありますか、それとも私の選択を分割する必要がありますか?

答えて

1

私はSAPでselect文を単純化し、データ選択に関与していないテーブルに対してLOOPとSELECT SINGLEを使用する方が効率的だと気づきました。

あなたの場合、テーブルVBFAからのデータは、データ選択の後にフェッチすることができます(DBからフェッチされるデータの量を制限していません)。

もちろん、インデックス、アプリケーションサーバーのバッファリングに依存しますが、SQLエキスパートにとっては直感的ではありませんが、SAPではあまり複雑ではないSELECT文を維持するのが最適です。

+0

Thx、これはもっと良い解決策だとわかっていますが、それがこのような巨大な選択肢で作られたのであれば私は不思議でした。私はちょうどテストしていた:)私は3つの小さな選択と 'Forすべてのエントリ'ステートメントを作成しました:Dとループので、私はテーブルをまとめることができます。 – kookies

0

私はSAP Abapについて知りません。しかし、SQLの観点からは、SAPでサポートされている派生クエリーを使用することができます。質問はSQLとしてタグ付けされたとして、これを投稿

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 

:ここ

は、いくつかのアプローチです。それは

+0

私はこれを試してみます。私はそれがサポートされていると思うが、私は間違っていない場合、selectで選択を使用するデータベース処理のために圧倒しています:) – kookies

+0

は、どのようにフィルタリングし、フィルタを置くかによって異なります。それ以外の方が賢明でない場合は、派生していないクエリ – Deb

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 

あなたはvbak~vbelnvbfa~vbelvを比較して、私はvbap~vbelnでそれを行います。どちらも同じ値ですが、onの場合は、もう一度vbapを使用してください。

+0

はい、私は何か試したことがわかっていますが、うまくいきませんでした。 :)それはどちらの方法でも同じ応答を与えます。はい、私は知っている、それは間違って結合を行うが、私は結合で使用しているテーブルをフォームではなく、別のフィールドを使用します。 – kookies

-1

左結合のon節のテーブルフィールドの順序を変更してください。 vbapを入れてください〜vbeln = vbfa〜vbelv

+0

なぜdownvote? –

関連する問題