带有连接的 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批量更新某列数据中的字段