ORACLE根据到达时间将用户消息移动到适当的目录中

时间:2012-06-20 14:24:44

标签: oracle

我的简化表结构如下所示:

MESSAGES(Id NUMBER,Content NVARCHAR2, Received_time TIMESTAMP)

DIRECTORIES(Id NUMBER, Name NVARCHAR2, PARENT NUMBER)

MESSAGES_USERS(Id NUMBER, MSG NUMBER (FK MESSAGES(Id)), USER NUMBER, DIRECTORY NUMBER (FK DIRECTORIES(Id)))

因此,任务是根据收到的时间将消息移动到适当的目录中。它是通过更新MASSAGES_USERS表并更改DIRECTORY id来实现的。 准备好的目录结构如下所示:

2012--
     |
     --- 04/2012
     |
     --- 05/2012 
     |
     --- 06/2012

因此,我必须将2012年4月收到的消息移动到名为04的目录中,该目录是当前用户目录结构中名为2012的目录的后代。 我使用

按名称搜索目录
name LIKE TO_CHAR(M.Received_time, 'MM')||'/'||EXTRACT(YEAR FROM M.Received_time)

有没有办法在不使用游标的情况下更新一个UPDATE语句中每条消息的目录?我已经尝试了一些核心更新,但没有一个(即使有一些巨大的子查询)是一个合适的解决方案。

该语句应使用消息接收时间(它重新查询加入这三个表)和MES​​SAGES_USERS表中的UPDATE DIRECTORY字段以及相应的已知id来获取适当的目录ID。

我不知道如何强制oracle使用appropiate目录更新每条消息,而不使用游标循环指定一条消息的id。这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

这样做吗?

update messages_users mu
set directory = 
( select d.id from directories d
  join messages m on d.name = to_char(m.receved_time, 'MM/YYYY')
  where m.id = mu.msg );