SQL-计算变量更新值之和

SQL-计算变量更新值之和,sql,postgresql,sum,Sql,Postgresql,Sum,我是SQL新手,有以下问题。 我想计算到达设备的错误总数 因此,假设我在my_表中有名为sekerr和totalsekerr的变量 我将它们初始化为0并进行了验证,但当我执行以下操作时: UPDATE my_table SET ... SeqErr = COALESCE(SeqErr, 0) + 1, TotalSeqErr = SeqErr, ... 我看到,当我检索此表时,它将带有以下值: sekerr=1,tota

我是SQL新手,有以下问题。
我想计算到达设备的错误总数

因此,假设我在
my_表
中有名为
sekerr
totalsekerr
的变量
我将它们初始化为
0
并进行了验证,但当我执行以下操作时:

  UPDATE my_table
  SET
  ...
    SeqErr         =      COALESCE(SeqErr, 0) + 1,
    TotalSeqErr    =      SeqErr,
  ...
我看到,当我检索此表时,它将带有以下值:
sekerr=1
totalsekerr=0
(即
sekerr
已更新,但
totalsekerr
使用的是旧的
sekerr
值,而不是更新的值)

如何解决此问题?

注意:这里可能有类似于我的问题,但我找不到。

如果您想让您的
TotalSekerr
使用“新的”
Sekerr
,您可以用更新
Sekerr
的相同方式进行更新:

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

您可以想象更新是一次完成的,而不是一行一行地完成。因此,您在等式右侧的内容引用了旧值,即使您将它们设置为上面一行的新值。

如果您希望您的
totalsekerr
使用“new”
sekerr
,您可以用更新
sekerr
的相同方式更新它:

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

您可以想象更新是一次完成的,而不是一行一行地完成。因此,等式右侧的引用是指旧值,即使您将它们设置为上面一行的新值。

更新的工作方式是“左侧”(即
集合
列)的引用引用是指新记录。“右侧”上的引用(即表达式)指的是旧值。SQL就是这样定义的。我只知道一个数据库不支持标准行为,MySQL/MariaDB

一种方法是重复表达式:

UPDATE my_table
  SET . . .
      SeqErr      =  COALESCE(SeqErr, 0) + 1,
      TotalSeqErr =  COALESCE(SeqErr, 0) + 1,
      ...;
假设您的表有一个主键,您还可以通过使用
FROM
子句和横向联接简化
SET
逻辑:

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>
更新我的表格t
设置
sekerr=v.new_sekerr,
TotalSekerr=v.new_Sekerr,
...
从my_表t2横向交叉连接
(值(合并(t2.sekerr,0)+1)
)五(新的)
其中t2=T

更新的工作方式是“左侧”(即
集合
列)上的引用引用新记录。“右侧”上的引用(即表达式)指的是旧值。SQL就是这样定义的。我只知道一个数据库不支持标准行为,MySQL/MariaDB

一种方法是重复表达式:

UPDATE my_table
  SET . . .
      SeqErr      =  COALESCE(SeqErr, 0) + 1,
      TotalSeqErr =  COALESCE(SeqErr, 0) + 1,
      ...;
假设您的表有一个主键,您还可以通过使用
FROM
子句和横向联接简化
SET
逻辑:

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>
更新我的表格t
设置
sekerr=v.new_sekerr,
TotalSekerr=v.new_Sekerr,
...
从my_表t2横向交叉连接
(值(合并(t2.sekerr,0)+1)
)五(新的)
其中t2=T

如果这是您的意思,我将使用
PostgreSQL
作为我的SQL数据库。您需要至少运行两次更新才能在TotalSekerr中看到非零值(但该赋值也应使用
coalesce()
)顺便说一句:
Sekerr
不是“变量”,如果这是您的意思,我正在使用
PostgreSQL
作为我的SQL数据库。您需要至少运行两次更新才能在TotalSekerr中看到非零值(但该赋值也应使用
coalesce()
),顺便说一句:
Sekerr
不是“变量”,它被称为一个列,所以在一个查询中没有这样做的方法?(如果我想
totalsekerr
获取
sekerr
更新的变量,我需要它在另一个查询中)@ms_stud:这是一个查询。在我的答案中添加了一个解释,请告诉我这是否有帮助,或者您是否需要额外的信息。请注意,
COALESCE(sekerr,0)+1
不是另一个查询,它是另一个表达式。所以在一个查询中没有这样做的方法?(如果我想
totalsekerr
获取
sekerr
更新的变量,我需要它在另一个查询中)@ms_stud:这是一个查询。在我的答案中添加了一个解释,请告诉我这是否有帮助,或者您是否需要额外的信息。请注意,
COALESCE(sekerr,0)+1
不是另一个查询,而是另一个表达式。