Я работаю с H2 DB и имею имя схемы STUDENT и имя таблицы POS
POS таблица имеет следующие атрибуты:
ID_NUMBER : она уникальна для каждой строки. PARTITION_ID : Это уникально для каждого STUDENT_ID .Сбрасывается на 1 для нового STUDENT_ID . STDUENT_ID : просто идентификатор для каждого студента. ДЕЙСТВИЕ : поле, которое будет обновлено.Объяснено ниже УРОВЕНЬ : Академический уровень.1 означает старшекурсник и 2 для магистров. POS : Программа обучения
ID_NUMBER || PARTITION_ID || STUDENT_ID || ACTION || LEVEL || POS
---------------------------------------------------------------------
1 || 1 || 8888 || || 1 || A
2 || 2 || 8888 || || 1 || A
3 || 3 || 8888 || || 1 || A
4 || 4 || 8888 || || 1 || A
5 || 5 || 8888 || || 1 || B
6 || 6 || 8888 || || 1 || C
7 || 7 || 8888 || || 1 || C
8 || 8 || 8888 || || 1 || C
9 || 9 || 8888 || || 2 || D
10 || 10 || 8888 || || 2 || E
11 || 11 || 8888 || || 2 || E
12 || 12 || 8888 || || 2 || E
13 || 1 || 9999 || || 1 || B
14 || 2 || 9999 || || 1 || A
15 || 3 || 9999 || || 1 || A
16 || 4 || 9999 || || 1 || A
17 || 5 || 9999 || || 1 || B
18 || 6 || 9999 || || 1 || B
19 || 7 || 9999 || || 1 || B
20 || 8 || 9999 || || 1 || B
21 || 9 || 9999 || || 2 || D
22 || 10 || 9999 || || 2 || D
23 || 11 || 9999 || || 2 || D
24 || 12 || 9999 || || 2 || D
Логика для обновления столбца действий:
Если POS изменяется между тем же уровнем, янеобходимо обновить столбец ACTION , указав CHANGE там, где произошло первое изменение.
Каким бы ни было последнее вхождение POS на том же уровне, должен быть помечен COMP
Таким образом, окончательный вывод должен быть таким, как показано ниже:
ID_NUMBER || PARTITION_ID || STUDENT_ID || ACTION || LEVEL || POS
---------------------------------------------------------------------
1 || 1 || 8888 || || 1 || A
2 || 2 || 8888 || || 1 || A
3 || 3 || 8888 || || 1 || A
4 || 4 || 8888 || || 1 || A
5 || 5 || 8888 || CHANGE || 1 || B
6 || 6 || 8888 || CHANGE || 1 || C
7 || 7 || 8888 || || 1 || C
8 || 8 || 8888 || COMP || 1 || C
9 || 9 || 8888 || || 2 || D
10 || 10 || 8888 || CHANGE || 2 || E
11 || 11 || 8888 || || 2 || E
12 || 12 || 8888 || COMP || 2 || E
13 || 1 || 9999 || || 1 || B
14 || 2 || 9999 || CHANGE || 1 || A
15 || 3 || 9999 || || 1 || A
16 || 4 || 9999 || || 1 || A
17 || 5 || 9999 || CHANGE || 1 || B
18 || 6 || 9999 || || 1 || B
19 || 7 || 9999 || || 1 || B
20 || 8 || 9999 || COMP || 1 || B
21 || 9 || 9999 || || 2 || D
22 || 10 || 9999 || || 2 || D
23 || 11 || 9999 || || 2 || D
24 || 12 || 9999 || COMP || 2 || D
Теперь я написал код SQL для достижения COMP статус.Это как показано ниже:
UPDATE STUDENT.POS AB
SET AB.ACTION = 'COMPLETE'
WHERE AB.PARTITION_ID = (SELECT MAX(PARTITION_ID)
FROM STUDENT.POS BC
WHERE BC.STUDENT_ID = AB.STUDENT_ID AND BC.LEVEL = AB.LEVEL)
Мой вопрос состоит в том, как выполнить обновление статуса CHANGE только для первого случая изменения в пределах каждого академического уровня для каждого студента?
ПРИМЕЧАНИЕ. Я использую H2 DB, которая в настоящее время не поддерживает такие функции, как Partition By или Over!
Я попытался выполнить подзапрос.Примерно так:
UPDATE STUDENT.POS AB
SET AB.ACTION = 'CHANGE'
WHERE AB.PARTITION_ID = (SELECT BC.PARTITION_ID
FROM UPDATE STUDENT.POS BC
WHERE BC.LEVEL = AB.LEVEL AND BC.POS != AB.POS)
AND BC.STUDENT_ID = AB.STUDENT_ID
Хотя это приводит к ошибке: Скалярный подзапрос содержит более одной строки .По иронии судьбы, это то, чего я пытаюсь достичь, обновляя несколько строк для каждого уровня под каждым идентификатором студента.