Sybase ASE перебирает две таблицы для вычисления данных

#sql #tsql #sap-ase

#sql #tsql #sap-ase

Вопрос:

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

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

Шаги:

  1. Получить все строки из таблицы-1, значение столбца datetime которых находится между заданным пользователем диапазоном datetime
  2. Для каждой строки из table-1 получаем строки из table-2, где значение datetime из строки table-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 По 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 По 2019-03-01 02:30 (строка определения)
Ожидаемый результат:
Хотя DEF попадает в диапазон дат STU и KJF, даты начала, т. е. C4 col любой строки, точно совпадают с DEF datetime

 ----------------------------------------------------
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         

  

Комментарии:

1. вам нужно показать, что вы пробовали.

2. @GordonLinoff добавил ожидаемые результаты. Извините за длинный вопрос.

3. Вы используете SQL Server или Sybase?

4. @GordonLinoff Sybase ASE

5. Если я правильно понял ваш вопрос. Сначала создайте временную таблицу из результатов «1.». Затем выполните итерацию, наведя на нее курсор. Примечание: Важно не выполнять итерацию по той же таблице, в которую вы фактически вставляете.