SQL-计算变量更新值之和
我是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
我想计算到达设备的错误总数 因此,假设我在
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
不是另一个查询,而是另一个表达式。