带有连接的 Oracle SQL 更新列

Posted

技术标签:

【中文标题】带有连接的 Oracle SQL 更新列【英文标题】:Oracle SQL update column with join 【发布时间】:2020-06-07 06:49:00 【问题描述】:

我有一个表官员,并在那里填充了一些数据。然后将一个名为 Total 的新列添加到该表中。现在我需要用从另一个表中选择的一些聚合数据填充这个新列。如何在不使用 PL/SQL 的情况下实现这一点?

我使用的两张表的关系

我想将该列初始化为每位警官因交通违法而预约司机的总次数。我尝试了以下方法,但它不起作用。

update officer q 
set q.TotalNumberOfBookedDrivers = a.total
left join (
    select officer_id, count(off_no) as total
    from offence
    group by officer_id
)a on q.officer_id = a.officer_id ;

【问题讨论】:

旁注:(1)计算行数时,使用count(*)。相比之下,count(something) 表示这个东西可以为空,而您只想计算非空的出现次数。 (2) TotalNumberOfBookedDrivers 不是我推荐的名字。数据库中的名称不区分大小写,因此工具或某人可能会对您的代码运行美化器并将名称更改为totalnumberofbookeddrivers。在 SQL 中通常使用下划线使名称可读:total_number_of_booked_drivers 一般不建议冗余存储聚合。因此,您不会存储总数,因为您始终可以从进攻表中获取它。但是,如果您知道要从攻击表中删除旧行并仍保留总数,那么可以,按照您的意图存储此总数,因为它不再是多余的。在这种情况下,官员表将具有实际总数,而进攻表将具有不完整的总数。当然,您会编写一个触发器来始终更新军官的总数。 【参考方案1】:

您不需要连接即可使用另一个表中的数据进行更新。直接的方法是使用相关子查询进行更新:

update officer
set TotalNumberOfBookedDrivers = 
(
  select count(*)
  from offence 
  where offence.officer_id = officer.officer_id
);

【讨论】:

以上是关于带有连接的 Oracle SQL 更新列的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库如何用update批量更新某列数据中的字段

oracle数据库如何用update批量更新某列数据中的字段

Oracle sql - 连接所有列

带有左连接的 Oracle 更新

根据连接表的日期列之一的最大日期值执行更新 (Oracle)

Oracle SQL 在 2 个条件下连接列