Я использую базу данных H2 в Java коде через JDB C.
У меня есть одна таблица с именем WP, которая имеет 6 столбцов (ID, COUNT, WP_NUM, WP_DEN, WEEK, YEAR).
Теперь мне нужно подготовленное утверждение, которое я могу дать значения для всех этих столбцов (кроме количества).
Когда еще нет строки с этим идентификатором, WEEK AND YEAR, он должен просто вставить значение счетчика равно 1.
В противном случае следует увеличить счетчик и обновить WP_NUM и WP_DEN в соответствии со значениями, полученными при вызове SADD (NUM_A, DEN_A, NUM_B, DEN_B).
SADD - это пользовательская функция I добавлено с помощью CREATE ALIAS ... FOR "...", которое определено в Java коде, который возвращает Integer [] {newNum, newDen}, используемый для добавления двух фракций NUM_A / DEN_A и NUM_B / DEN_B.
Что я придумал, так это следующее, хотя это кажется немного сложным. Основная сложность, которую я имею, заключается в том, чтобы как-то сохранить значение, которое возвращает функция, поэтому мне не нужно вызывать его несколько раз, поскольку это довольно дорого. Можно ли как-нибудь упростить это?
MERGE INTO WP
USING (
SELECT C1, C2, C3, C4, C5, S[1] AS NUM, S[2] AS DEN
FROM (
SELECT V.*,
CASE WHEN ID = C1 AND WEEK = C4 AND YEAR = C5 THEN SADD(C2, C3, WP_NUM, WP_DEN) ELSE ARRAY[0, 0] END AS S
FROM WP, VALUES(?, ?, ?, ?, ?) AS V
) AS A
ORDER BY NUM DESC
LIMIT 1
) AS B
ON (ID = C1 AND WEEK = C4 AND YEAR = C5)
WHEN MATCHED THEN
UPDATE SET COUNT = COUNT + 1, WP_NUM = NUM, WP_DEN = DEN
WHEN NOT MATCHED THEN
INSERT VALUES (C1, 1, C2, C3, C4, C5);
Редактировать: Я кое-что понял.
MERGE INTO WP
USING (
SELECT * FROM
VALUES(?, ?, ?, ?, ?) AS V(ID, NUM, DEN, WEEK, YEAR)
) AS B
ON (WP.ID = B.ID AND WP.WEEK = B.WEEK AND WP.YEAR = B.YEAR)
WHEN MATCHED THEN
UPDATE SET COUNT = COUNT + 1, (WEIGHTED_POINTS_NUM, WEIGHTED_POINTS_DEN) = (SADD(B.NUM, B.DEN, WEIGHTED_POINTS_NUM, WEIGHTED_POINTS_DEN))
WHEN NOT MATCHED THEN
INSERT VALUES (B.ID, 1, NUM, DEN, B.WEEK, B.YEAR);
Теперь единственное, что до сих пор беспокоит меня - это выбор внутри USING , Должен быть лучший способ переименовать выражения выражения VALUES.