MYSQL триггер с обновлением - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать триггер для обновления поля таблицы, ссылаясь на другую таблицу после обновления этой же таблицы.Я пробовал следующие фрагменты кода, но продолжаю получать ошибку # 1064 при каждой попытке.Может кто-нибудь подсказать, что не так.попытка цитаты 1.

BEGIN
UPDATE `incent` a INNER JOIN `inc_prog` b  
SET a.`earned` =
CASE WHEN a.incactualn < b.n1 THEN 0 
CASE WHEN a.incactualn  BETWEEN b.n1 AND b.m1 THEN b.arp1
CASE WHEN a.incactualn  BETWEEN b.n2 AND b.m2 THEN b.arp1+b.arp2
CASE WHEN a.incactualn  BETWEEN b.n3 AND b.m3 THEN b.arp1+b.arp2+b.arp3
CASE WHEN a.incactualn  BETWEEN b.n4 AND b.m4 THEN b.arp1+b.arp2+b.arp3+b.arp4
CASE WHEN a.incactualn  BETWEEN b.n5 AND b.m5 THEN b.arp1+b.arp2+b.arp3+b.arp4+b.arp5
END

=== завершить попытку 1

попытка 2

BEGIN
UPDATE
    a    
SET
a.earned = 
CASE WHEN a.incactualn < b.n1 THEN '0' 
CASE WHEN a.incactualn  BETWEEN b.n1 AND b.m1 THEN b.arp1
CASE WHEN a.incactualn  BETWEEN b.n2 AND b.m2 THEN b.arp1+b.arp2
CASE WHEN a.incactualn  BETWEEN b.n3 AND b.m3 THEN b.arp1+b.arp2+b.arp3
CASE WHEN a.incactualn  BETWEEN b.n4 AND b.m4 THEN b.arp1+b.arp2+b.arp3+b.arp4
CASE WHEN a.incactualn  BETWEEN b.n5 AND b.m5 THEN b.arp1+b.arp2+b.arp3+b.arp4+b.arp5

FROM
    incent a
INNER JOIN
    inc_prog b
ON
    a.Incent_name = b.incname && a.period = b.finyear
END

======= завершить попытку 2

UNQUOTE

1 Ответ

0 голосов
/ 12 ноября 2018

Слово CASE ставится только в начале выражения CASE. Просто удалите вторую и последующие копии. Итак, ваш первый триггер становится:

BEGIN
    UPDATE `incent` a INNER JOIN `inc_prog` b  
    SET a.`earned` =
        CASE WHEN a.incactualn < b.n1 THEN 0 
             WHEN a.incactualn  BETWEEN b.n1 AND b.m1 THEN b.arp1
             WHEN a.incactualn  BETWEEN b.n2 AND b.m2 THEN b.arp1+b.arp2
             WHEN a.incactualn  BETWEEN b.n3 AND b.m3 THEN b.arp1+b.arp2+b.arp3
             WHEN a.incactualn  BETWEEN b.n4 AND b.m4 THEN b.arp1+b.arp2+b.arp3+b.arp4
             WHEN a.incactualn  BETWEEN b.n5 AND b.m5 THEN b.arp1+b.arp2+b.arp3+b.arp4+b.arp5
        END;
END

Во второй попытке вы пропускаете END в конце выражения CASE, а также (SELECT и) вокруг подзапроса:

BEGIN
    UPDATE a    
    SET a.earned = (SELECT
        CASE WHEN a.incactualn < b.n1 THEN '0' 
             WHEN a.incactualn  BETWEEN b.n1 AND b.m1 THEN b.arp1
             WHEN a.incactualn  BETWEEN b.n2 AND b.m2 THEN b.arp1+b.arp2
             WHEN a.incactualn  BETWEEN b.n3 AND b.m3 THEN b.arp1+b.arp2+b.arp3
             WHEN a.incactualn  BETWEEN b.n4 AND b.m4 THEN b.arp1+b.arp2+b.arp3+b.arp4
             WHEN a.incactualn  BETWEEN b.n5 AND b.m5 THEN b.arp1+b.arp2+b.arp3+b.arp4+b.arp5
        END
    FROM incent a
    INNER JOIN inc_prog b ON a.Incent_name = b.incname && a.period = b.finyear);
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...