Функция DB2 SQL, возвращающая несколько значений, когда я ожидаю только одно - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь узнать местоположение последнего перемещения элемента с помощью функции sql с кодом ниже. Pretty basi c, я просто пытаюсь получить максимальную дату и время. Если я запускаю sql как обычный выбор и жёстко кодирую номер элемента в ATPRIM, я получаю только одно местоположение. Но если я создаю эту функцию, а затем пытаюсь запустить ее, а затем передать ей номер элемента, я получаю каждое вхождение в файле истории, а не только МАКС, который будет самым последним. Кроме того, я попробовал Select Distinct, и он ничего не сделал для меня.

  • ATOGST = Местоположение элемента
  • ATPRIM = Элемент
  • ATDATE = Дата
  • ATTIME = Время
CREATE FUNCTION ERPLXU/F@QAT1(AATPRIM VARCHAR(10))                
      RETURNS CHAR(50)                                            
   LANGUAGE SQL                                                   
   NOT DETERMINISTIC                                              
BEGIN DECLARE F@QAT1 CHAR(50) ;                                   
SET F@QAT1 = ' ' ;                                                
    SELECT ATOGST                                        
     INTO F@QAT1 FROM ERPLXF/QAT as t1                            
     WHERE ATPRIM = AATPRIM                                       
            AND ATDATE = (SELECT MAX(ATDATE) FROM ERPLXF/QAT AS T2
                 WHERE T2.ATPRIM = AATPRIM)                       
            AND ATTIME = (SELECT MAX(ATTIME) FROM ERPLXF/QAT AS T3
                 WHERE T3.ATPRIM = AATPRIM                        
                        AND T3.ATDATE = T1.ATDATE) ;              
RETURN F@QAT1 ;                                                   
END 

РЕДАКТИРОВАТЬ: Итак, что я пытаюсь сделать, это получить это местоположение, и я заставил его работать на моем iSeries в str sql, но проблема в том, что мы используем веб-приложение под названием Web Object Wizard (WoW), которое позволяет нам использовать sql для создания отчетов, более удобных для пользователя. Ниже приведено то, что я пытался заставить работать, но подзапрос в select не работает в WoW, поэтому я пытался создать функцию, которая, как нам известно, работает в других приложениях.

SELECT distinct t1.atprim, atdesc, dbtabl, dbdtin, dblife, dblpdp,  
dbcost, dbbas, dbresv, dbyrdp, dbcurr,                              

(select atogst                                                      
from erplxf.qat as t2                                               
where t1.atprim = t2.atprim and atdate = (select max(atdate) from   
erplxf.qat as t3 where t2.atprim = t3.atprim) and attime = (select  
max(attime) from erplxf.qat as t4 where t1.atprim = t4.atprim and   
t1.atdate = t4.atdate)                                              
) as @113_ToLoc                                                     

FROM erplxf.qat as t1 join erplxf.qdb on atassn = dbassn            
where dbrcid = 'DB'                                                   
and dbcurr != 0

Вместо этого этого подзапроса в конце выбора это будет просто

, erplxu.f@qat1(atprim) as @113_ToLoc

1 Ответ

1 голос
/ 31 марта 2020

Попробуйте это:

CREATE FUNCTION ERPLXU/F@QAT1(AATPRIM VARCHAR(10))                
RETURNS CHAR(50)                                            
LANGUAGE SQL                                                                                                 
RETURN                                            
SELECT ATOGST                                        
FROM ERPLXF/QAT                      
WHERE ATPRIM = AATPRIM               
ORDER BY ATDATE DESC, ATTIME DESC
FETCH FIRST 1 ROW ONLY;
...