Sybase ASE перебирает две таблицы для расчета данных - PullRequest
0 голосов
/ 18 марта 2019

Я не очень разбираюсь в SQL, и мне интересно, как это сделать в хранимой процедуре Syabse - ASE. Буду признателен за любые указания по этому вопросу.

У меня есть table-1 (t1) и table-2 (t2), которые мне нужно зациклить для таких вычислений, как (t1.c4 + t2.c3) * 2 + (t1.c5 + t2.c4) * 5 .

Шаги:

  1. Получить все строки из таблицы-1, чье значение столбца datetime находится между заданным пользователем диапазоном datetime
  2. Для каждой строки из таблицы-1 получить строку (и) из таблицы-2, где значение datetime из строки таблицы-1 находится между значениями столбца start datetime и end datetime в table-2
  3. Если из таблицы 2 сопоставлено только 1 строку, возьмите значения из строки таблицы 1 и строки таблицы 2, выполните вычисления и выполните шаг 7
  4. Если найдено более 1 строки, найдите строку из таблицы-2, чья дата и время начала точно совпадает с датой-временем из строки таблицы-1
  5. Если точное совпадение не найдено, отметьте ошибку в строке таблицы-1 и перейдите к следующей строке из таблицы-1
  6. Если найдено только одно совпадение строк, выполните вычисления и выполните шаг-7
  7. Вставить результат расчета в текущую строку таблицы-1
  8. Перейти к шагу 2; пока в таблице не осталось больше строк-1

Какой оптимальный подход для этого? Должен ли я использовать курсор или временные таблицы?

T1
------------------------------------------------
C1   C2    C3       C4                  C5   C6
------------------------------------------------
ABC  10   15        2019-03-01 00:30
XYZ  12   13        2019-03-01 01:00  
DEF  5    7         2019-03-01 02:00  
IJK  17   3         2019-03-02 01:00  

T2
------------------------------------------------
C1   C2    C3       C4                    C5
------------------------------------------------
LMN  1     5        2019-03-01 00:30   2019-03-02 00:00
OPQ  2     3        2019-03-01 01:00   2019-03-01 01:30
STU  4     2        2019-03-01 01:30   2019-03-01 03:00
KJF  3     1        2019-03-01 02:30   2019-03-01 03:00

Ввод пользователя: 2019-03-01 с 00:00 до 2019-03-01 00:30 (соответствие строк ABC и LMN) Ожидаемый выход:

------------------------------------------------------------
C1   C2    C3       C4                  C5             C6
--------------------------------------------------------------
ABC  10   15        2019-03-01 00:30    (10*1)+(15*5)
XYZ  12   13        2019-03-01 01:00  
DEF  5    7         2019-03-01 02:00  
IJK  17   3         2019-03-02 01:00  

Ввод пользователя: 2019-03-01 с 01:00 до 2019-03-01 01:30 (совпадение строк XYZ и OPQ) Ожидаемый выход:

------------------------------------------------------------
C1   C2    C3       C4                  C5             C6
--------------------------------------------------------------
ABC  10   15        2019-03-01 00:30    
XYZ  12   13        2019-03-01 01:00    (12*2)+(13*3)
DEF  5    7         2019-03-01 02:00  
IJK  17   3         2019-03-02 01:00  

Ввод пользователя: 2019-03-01 23:59 TO 2019-03-02 01:00 (строка IJK и нет совпадающих строк в t2) Ожидаемый результат:

----------------------------------------------------
C1   C2    C3       C4                  C5     C6
----------------------------------------------------
ABC  10   15        2019-03-01 00:30
XYZ  12   13        2019-03-01 01:00  
DEF  5    7         2019-03-01 02:00  
IJK  17   3         2019-03-02 01:00         No matching row

Ввод пользователя: 2019-03-01 01:30 TO 2019-03-01 02:30 (строка DEF) Ожидаемый результат: Хотя DEF попадает в даты начала диапазона дат STU & KJF, т. Е. Столбец C4 каждой строки совпадает с датой и временем DEF точно

----------------------------------------------------
C1   C2    C3       C4                  C5     C6
----------------------------------------------------
ABC  10   15        2019-03-01 00:30
XYZ  12   13        2019-03-01 01:00  
DEF  5    7         2019-03-01 02:00          No unique match
IJK  17   3         2019-03-02 01:00         

...