0

私は何とかより多くの選択とループで選択を行うことができます。4つのテーブル(最後のテーブルはすべてのデータを収集するためのものでした)

しかし今、私は1つのselectステートメントで必要なすべてのフィールドを選択する方法を考えています。これが巨大な選択です:)

  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」と比較できません。LEFTOUTERJOINを使用して、テーブルを最大1つの他のテーブルと結合できます」LEFT JOINを使用せず、JOINのみを使用する場合動作しますが、必要なものがすべて得られません。配達注文が割り当てられていない場合でも、すべての販売注文を取得する必要があります。それを行う方法はありますか、それとも本当に選択を分割する必要がありますか?

4

4 に答える 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 = 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.

結果をテストすることはできませんが、構文チェックには次のように書かれています。

わずかな違いが1つだけあります。

                                                  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-clauseでもう一度使用しvbapます。

于 2012-04-13T11:38:28.330 に答える
1

SAPで、selectステートメントを単純化し、データ選択に関与しないテーブルに対してLOOPおよびSELECTSINGLEを続行する方が効率的であることに気付きました。

あなたの場合、テーブルVBFAからのデータは、データ選択後にフェッチされる可能性があります(DBからフェッチされるデータの量を制限するものではありません)。

もちろん、それはインデックス、アプリケーションサーバーのバッファリングに依存します...しかし、SQLの専門家にとっては直感に反するかもしれませんが、SAPでselectステートメントをあまり複雑にしないことが最善です。

于 2012-04-17T10:30:03.710 に答える
0

SAPAbapについて知りません。ただし、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としてタグ付けされます。それがうまくいくことを願っています

于 2012-04-12T06:28:37.083 に答える
-1

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

于 2012-08-22T19:52:12.097 に答える