2012-04-12 1 views
0

и новая проблема :)выберите еще поле в пределах одного выберите abap sap

Мне удалось сделать выбор с большим количеством выборок и цикла. 4 таблицы (последний был только для сбора всех данных) Но теперь я думаю о способе выбора всех полей, которые мне нужны, только с одним предложением 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 ». Таблица может быть объединена с максимальной одной другой таблицей, используя LEFT OUTER JOIN» Если я не использую LEFT JOIN и только JOIN он работает, но я не получаю все, что хочу. Мне нужно получить ВСЕ ЗАКАЗЫ ПРОДАЖИ, даже если у них нет ЗАКАЗА ПОСТАВКИ. Есть ли способ сделать это, или мне действительно нужно разделить мой выбор?

ответ

1

Я заметил в SAP, что более эффективно упростить операции выбора операторов и продолжить работу с LOOP и SELECT SINGLE для таблицы, которые не участвуют в выборе данных.

В вашем случае данные из таблицы VBFA могут быть выбраны после выбора данных (это не ограничивает объем данных, извлекаемых из БД).

Конечно, это зависит от индексов, буферизации сервера приложений ... но, даже если это может быть интуитивно понятным для экспертов SQL, лучше всего делать предложения выбора, которые не слишком сложны в SAP.

+0

Thx, я знаю, что это лучшее решение, но мне было любопытно, возможно ли это сделать в таком огромном выборе. Я просто тестировал :) Я сделал это с тремя меньшими выборами и оператором «Для всех записей»: D и цикл, чтобы я мог объединить таблицы. – kookies

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

ok thx, я попробую это. я думаю, что это поддерживается, но для обработки базы данных, но для подавляющего большинства, для использования select в 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. 

Я не могу проверить результат, но проверка синтаксиса сказать: ок.

Существует только одна малюсенькая разница:

            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 -clause вы снова используете vbap.

+0

да, я знаю, что я что-то пробовал, но не работал. :) он дает тот же ответ в любом случае. Да, я знаю, неправильно делать соединение, но использовать разные поля, а не создавать таблицы, которые я использую в join. – kookies

-1

Попробуйте изменить порядок полей таблицы в позиции on левого соединения. Положите vbap ~ vbeln = vbfa ~ vbelv

+0

Почему downvote? –

 Смежные вопросы

  • Нет связанных вопросов^_^