Я не очень разбираюсь в SQL, и мне интересно, как это сделать в хранимой процедуре Syabse - ASE. Буду признателен за любые указания по этому вопросу.
У меня есть table-1 (t1) и table-2 (t2), которые мне нужно зациклить для таких вычислений, как (t1.c4 + t2.c3) * 2 + (t1.c5 + t2.c4) * 5 .
Шаги:
- Получить все строки из таблицы-1, чье значение столбца datetime находится между заданным пользователем диапазоном datetime
- Для каждой строки из таблицы-1 получить строку (и) из таблицы-2, где значение datetime из строки таблицы-1 находится между значениями столбца start datetime и end datetime в table-2
- Если из таблицы 2 сопоставлено только 1 строку, возьмите значения из строки таблицы 1 и строки таблицы 2, выполните вычисления и выполните шаг 7
- Если найдено более 1 строки, найдите строку из таблицы-2, чья дата и время начала точно совпадает с датой-временем из строки таблицы-1
- Если точное совпадение не найдено, отметьте ошибку в строке таблицы-1 и перейдите к следующей строке из таблицы-1
- Если найдено только одно совпадение строк, выполните вычисления и выполните шаг-7
- Вставить результат расчета в текущую строку таблицы-1
- Перейти к шагу 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