【问题标题】:How to update a table with data from same table in sql [duplicate]如何在sql中使用来自同一表的数据更新表[重复]
【发布时间】:2020-04-24 15:34:12
【问题描述】:

我有一个要更新的 SQL 表

NAME   Emp_ID   Points   TotalPoints
ABC    1        50       0
ABC    1        40       0
XYZ    2        20       0
LMN    3        30       0
LMN    3        50       0
XYZ    2        10       0
LMN    3        5        0

请帮我通过总结点来更新如下所示的同一张表

NAME   Emp_ID   Points   TotalPoints
ABC    1        50       90
ABC    1        40       90
XYZ    2        20       30
LMN    3        30       85
LMN    3        50       85
XYZ    2        10       30
LMN    3        5        85

【问题讨论】:

  • 这与使用不同表中的值进行更新没有什么不同。如果你能做到这一点,那么这也应该有效。到目前为止,您尝试过什么?
  • 请参考Why should I “tag my RDBMS”?,这里写的是:'SQL'代表Structured Query Language,但它不是编程语言,像Python或C# 所以每个DBMS可能使用不同的 SQL 语法,我假设您想要适合您正在使用的 DBMS 的 SQL,对吧?此外,添加 DBMS 标签会吸引有使用该 DBMS 经验的人。
  • 该表没有被规范化(如果点不是唯一的,那么没有候选键;NAME 依赖于Emp_ID 并重复,TotalPoints 也是如此(如果有一个候选关键,这将违反 2NF)),因此容易出现数据完整性问题。该表应首先规范化为附加表。之后,总分可以(例如)在视图中计算或通过触发器更新; “How best to recalculate group by values”解决了这个问题。

标签: sql


【解决方案1】:

我只在 Oracle 18c 数据库上尝试过以下 SQL,但我相信它是相当标准的 SQL,因此应该适用于所有主要的 DBMS

update EMPS E1
   set E1.TOTAL_POINTS = (select sum(E2.POINTS)
                            from EMPS E2
                           where E2.EMP_ID = E1.EMP_ID)
【解决方案2】:

试试下面的,这里是DEMO。此代码适用于 MySQL 8.0、SQL Server 和 PostgreSQL。

select
    name,
    emp_id,
    points,
    sum(points) over (partition by emp_id) as total_points
from yourTable
order by
    name

【讨论】:

  • 我认为OP想要更新列,而不是返回数据,但不清楚。很抱歉你的编辑,早些时候 - 我同时做了我的(认为你的也是一样?)但由于我有足够的声誉,我的声誉很快就通过了,一旦发生冲突的编辑,你的就被自动拒绝了
  • 适用于 MySQL 和 Postgres?为什么,我从来没有。好吧,我收回我的评论。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2019-12-19
  • 2017-05-25
相关资源
最近更新 更多