SQL — Вычисление суммы обновленных значений переменных

#sql #postgresql #sum

#sql #postgresql #сумма

Вопрос:

Я новичок в SQL, и у меня следующая проблема.
Я хочу суммировать общее количество ошибок, которые достигают моего устройства.

Итак, предположим, что у меня есть внутренние my_table переменные с именами SeqErr и TotalSeqErr .
Я инициализировал их 0 и проверил, но когда я делаю следующее:

   UPDATE my_table
  SET
  ...
    SeqErr         =      COALESCE(SeqErr, 0)   1,
    TotalSeqErr    =      SeqErr,
  ...
  

Я вижу, что когда я извлекаю эту таблицу, она приходит со следующими значениями:
SeqErr = 1 , TotalSeqErr = 0 (т. е. SeqErr был обновлен, но TotalSeqErr использует старое SeqErr значение вместо обновленного).

Как я могу решить эту проблему?
Возможно, здесь есть проблема, похожая на мою, но я не смог ее найти.

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

1. Я использую PostgreSQL в качестве своей базы данных SQL, если вы это имели в виду.

2. Вам нужно будет запустить это ОБНОВЛЕНИЕ как минимум дважды, чтобы увидеть ненулевое значение в totalseqerr (но это назначение также должно использоваться coalesce() ) dbfiddle.uk /…

3. Кстати: seqerr это не «переменная», она называется столбцом

Ответ №1:

Если вы TotalSeqErr хотите использовать «новый» SeqErr , вы можете просто обновить его так же, как вы обновляете SeqErr :

 ...
SeqErr         =      COALESCE(SeqErr, 0)   1,
TotalSeqErr    =      COALESCE(SeqErr, 0)   1,
...
  

Вы можете себе представить, что обновление выполняется сразу, а не построчно. Итак, то, что у вас есть в правой части равенства, относится к старым значениям, даже если вы установили для них новое значение на строку выше.

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

1. Значит, нет способа сделать это внутри одного запроса? (В случае, если я хочу TotalSeqErr получить SeqErr обновленную переменную, мне нужно, чтобы она была внутри другого запроса)

2. @ms_stud: это один запрос.

3. Добавлено объяснение к моему ответу, дайте мне знать, если это поможет или если вам потребуется дополнительная информация. Обратите внимание, что COALESCE(SeqErr, 0) 1 это не другой запрос, это другое выражение.

Ответ №2:

Способ работы обновления заключается в том, что ссылки «слева» (т. Е. set Столбцы) ссылаются на новую запись. Ссылки «справа» (то есть выражения) относятся к старым значениям. Так определяется SQL. Я знаю только одну базу данных, которая не поддерживает стандартное поведение, MySQL / MariaDB.

Один из методов заключается в повторении выражения:

 UPDATE my_table
  SET . . .
      SeqErr      =  COALESCE(SeqErr, 0)   1,
      TotalSeqErr =  COALESCE(SeqErr, 0)   1,
      ...;
  

Предполагая, что ваша таблица имеет первичный ключ, вы также можете упростить SET логику, используя FROM предложение и боковое соединение:

 UPDATE my_table t
      SET . . .
          SeqErr      =  v.new_SeqErr,
          TotalSeqErr =  v.new_SeqErr,
          ...
    FROM my_table t2 CROSS JOIN LATERAL
         (VALUES (COALESCE(t2.SeqErr, 0)   1)
         ) v(new_seqerr)
    WHERE t2.<primary key> = t.<primary key>