2015-02-09 68 views
0

我有一个关于Oracle的问题。oracle连接深度,同时更新表

我知道Oracle只支持在第一个子查询级别使用别名。这在更新表格时想要分组多次时会出现问题。

示例:我有一些服务器组和一个包含有关它们的信息的数据库。我有一个表,其中包含有关组的信息,以及我使用时间戳存储的一张表(确切地说:我实际上使用了日期)组中特定服务器的工作负载。

现在,我已经在服务器表中发现了一个非规范化字段,其中包含该组在一天内的最高工作负载。

我想要做的是一样的东西

update server_group 
    set last_day_workload=avg(workload1) 
    from (select max(workload) workload1 
     from server_performance 
     where server_performance.server_group_ID_fk=server_group.ID 
      and time>sysdate-1 
     group by server_performance.server_group_ID_fk) 

虽然ID是server_group和server_group_ID_fk从server_performance表的外键引用的主键。我目前使用的解决方案是将第一个连接写入临时表并在下一个语句中从该临时表中更新。有一个更好的方法吗?

在这个问题中,它还没有这个问题,但是如果使用临时表增加数据量不仅需要花费一些时间,而且还需要大量的RAM。

谢谢你的回答!

回答

0

如果我是你,我会在select语句中计算出我想要的结果,然后使用a MERGE statement来进行必要的更新。

+0

谢谢你的评论。我遇到的问题是,我首先实现解决方案,然后在大桌子上再次加入条件(就像我现在正在使用临时表一样)。即使它是一个精确的加入,它需要一些时间来执行它(通常没关系,因为非sematic PK的索引足够小以保持缓冲)。如果PK指数会很大以保持缓冲,那将是完全疯狂的。 – cautch 2015-02-16 14:54:11

+0

如果您想每天更新此字段不仅一次,而且当另一列current_monitored发生更改时触发器还会更新?计算整个表格以将单一行合并到实际表格中将是一项完全浪费。 – cautch 2015-02-16 14:58:17

+0

虽然您的原始示例并不是特别清楚,但很难就最佳操作方式向您提供建议。也许如果你想用你创建的表格脚本(包括约束和索引)来更新你的问题,并且使用样例数据(作为插入语句)以及预期的输出,我们可以帮助你更好。 – Boneist 2015-02-16 14:58:28