Нужен эффективный запрос выбора

Я хотел бы знать эффективный способ получения данных в следующем случае.

Есть две таблицы, скажем, Table1 и Table2, имеющие два общих поля, скажем, contry и pincode, и другая таблица «Table3», имеющая ключевые поля первых двух таблиц (DNO, MPNO).

Вот небольшой глюк, в данных table3, если у него есть DNO, у него не будет MPNO

Итак, когда на экране выбора (рис. 2), если вы вводите какую-либо вещь, результат должен быть следующим

**MFID  |  DNO        |  MPNO     | COUNTRY | PINCODE**
----------
00001   |   10011     |  novalue  | IN      | 4444
00002   |   Novalue   |  1200     | IN      | 5555
00003   |   300       |  novalue  | US      | 9999

(как вы можете заметить, если DNO не представляет MPNO, и наоборот)

Для наглядности посмотрите на картинки :-)

Связь таблиц:  Связь таблиц

Экран выбора с параметрами выбора:

Экран выбора с параметрами выбора

Код не должен быть длинным.


person Nagendra Babu    schedule 21.11.2015    source источник


Ответы (2)


КОД ПСЕВДО:

Выберите запросы:

  1. Выберите * из table3 в it_table3.

  2. Выберите * from table1 ДЛЯ ВСЕХ ЗАПИСЕЙ В it_table3 INTO it_table1 ГДЕ dno = table3-dno.

  3. Выберите * из table2 ДЛЯ ВСЕХ ЗАПИСЕЙ В it_table3 INTO it_table2 ГДЕ mpno = table3-mpno.

  4. Перейдите к внутреннему столу 3 и создайте финальный стол. ПЕРЕЙТИ из it_table3 в wa_table3.

    IF wa_table3-dno IS NOT INITIAL.
    READ it_table1 where dno = wa_table3-dno.
    ELSE.
    READ it_table2 where mpno = wa_table3-mpno.
    ENDIF.
    
    ENDLOOP.
    

Надеюсь, это был ответ, который вы надеялись найти!

person Arjun    schedule 22.11.2015
comment
Есть ли способ добиться этого с помощью INNER JOIN, если возможно, вы могли бы отправить его .. а как насчет выбора с помощью COUNTRY ..? - person Nagendra Babu; 23.11.2015

Для построения эффективного выбора потребуется информация об обязательных полях на экране выбора, а также о предполагаемом производственном размере всех трех таблиц. Однако без этой информации предположим, что table1 и table2 являются справочными таблицами, а table3 - таблицей транзакций, как он может предположить из их структуры. Было бы разумно построить отбор следующим образом:

  1. Выбор данных из справочных таблиц. Как вы сказали, поля DNO / MPNO являются взаимоисключающими, тогда в обеих справочных таблицах не будет совпадений пары страна / пин-код, поэтому JOIN здесь бесполезен. Однако мы можем объединить 2 набора результатов в один itab без каких-либо нарушений ограничений.

    TYPES: BEGIN OF tt_result,
             dno     TYPE table1-dno,
             mpno    TYPE table2-mpno,
             country TYPE table1-country,
             pincode TYPE table1-pincode,
            ...other field from table3
           END OF tt_result.
    
    DATA: itab_result TYPE tt_result.
    
    SELECT dno
      FROM table1
      INTO CORRESPONDING FIELDS OF TABLE itab_result
     WHERE pincode IN so_pincode
       AND country IN so_country.
    
    SELECT mpno
      FROM table2
      APPENDING CORRESPONDING FIELDS OF TABLE itab_result
     WHERE pincode IN so_pincode
       AND country IN so_country.
    
  2. Добавление FOR ALL ENTRIES позволяет указать одну и ту же таблицу в предложении FOR ALL ENTRIES и в предложении INTO, поэтому мы можем заполнить нашу таблицу результатов отсутствующими данными table3 с помощью ключа DNO / MPNO.

    SELECT *
      FROM table3
      INTO CORRESPONDING FIELDS OF TABLE itab_result
       FOR ALL ENTRIES IN itab_result
        ON itab_result~dno = itab3~dno
       AND itab_result_mpno = itab3~mpno.
    
person Suncatcher    schedule 28.12.2015