#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>