Нужно написать SQL, чтобы сделать то, что делается 3 QUERY/400

Мне нужно написать логическое представление или 2 для обработки устаревшего Query/400. Первый запрос создает временный файл, который является входным для второго запроса (а второй создает временный файл для третьего запроса). Цель состоит в том, что мы хотим увидеть, у каких клиентов нет «корректирующего» заказа, который мы получаем во втором запросе.

В первом запросе он выбирает из OEINH1 и сопоставляет с Address_Table, чтобы получить адрес электронной почты клиента, и выбирает на

T01.IHDOCD        DOCUMENT DATE                
T01.IHENT#        ENTITY NUMBER                
T01.IHSFX#        SUFFIX NUMBER                
T01.IHINV#        INVOICE NUMBER               
T02.ADINTA        INTERNET ADDRESS             

Эти столбцы и выбор записи:

IHORDT            EQ     'INT'        **** order type              
AND    IHVIAC            NLIST  'PML' 'FCM'               
AND    ADSFX#            EQ     '000'          
  1. Второй запрос соответствует IHENT# (cust #) И выбирает по этому:

    IHORDT            LIST   'COR' 'COE'     
    

    и записывает все столбцы как из первого временного файла, так и из того же OEINH1 во второй временный файл.

Повторить это именно в SQL проблематично, потому что есть повторяющиеся имена полей. По сути, я думаю, что нужно взять первый временный файл, а затем получить два других типа заказов, которые есть у этого клиента (COR COE).

Это что-то вроде этого

Select * 
from TEMP FILE1 
where ENT in (Select * 
              from OEINH1 
              where IHORDT in ('COR' "COE')

имеет ли это смысл в зависимости от того, что делает запрос / 400?

Затем последний запрос QUERY/400 сравнивает 2 временных файла, используя UNMATCHED для типа соединения. Таким образом, мы можем знать, какие записи находятся в первом проходе, но не во втором временном файле.


person Adams    schedule 09.04.2014    source источник


Ответы (1)


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

Это не проверено:

select h.IHDOCD, h.IHENT#, h.IHSFX#, h.IHINV#, a.ADINTA
from OEINH1 h 
  join Address_Table a
    on h.ihent# = a.customer_id
where h.IHORDT = 'INT'
  AND h.IHVIAC not in ('PML' 'FCM')
  AND ADSFX# = '000' 
  and h.ihent# in (
    select cor.ihent# 
      from oeinh1 cor
      where cor.IHORDT in ('COR' 'COE'))
person Buck Calabro    schedule 10.04.2014
comment
Моя точка зрения заключалась в том, что обычно не рекомендуется использовать SQL для эмуляции старого пакетного процесса. Для создания нового процесса лучше использовать SQL. - person Buck Calabro; 10.04.2014
comment
Я (почти всегда) согласен с @BuckCalabro, и это не изменение. Однако вы можете получить некоторые подсказки об использовании SQL, используя команду RTVQMQRY для каждого из трех старых запросов Query/400. Команды могут выглядеть примерно так: RTVQMQRY QMQRY(<OLDQry400>) SRCFILE(QQMQRYSRC) ALWQRYDFN(*ONLY). Изучите три результирующих исходных элемента, чтобы увидеть возможные элементы заменяющего SQL. Сравните то, что вы видите, с ответом здесь. Это может помочь в будущих задачах по замене Query/400. (Может быть.) - person user2338816; 11.04.2014