#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, значение столбца datetime которых находится между заданным пользователем диапазоном datetime
- Для каждой строки из table-1 получаем строки из table-2, где значение datetime из строки table-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 По 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.». Затем выполните итерацию, наведя на нее курсор. Примечание: Важно не выполнять итерацию по той же таблице, в которую вы фактически вставляете.