我的简化表结构如下所示:
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语句中每条消息的目录?我已经尝试了一些核心更新,但没有一个(即使有一些巨大的子查询)是一个合适的解决方案。
该语句应使用消息接收时间(它重新查询加入这三个表)和MESSAGES_USERS表中的UPDATE DIRECTORY字段以及相应的已知id来获取适当的目录ID。
我不知道如何强制oracle使用appropiate目录更新每条消息,而不使用游标循环指定一条消息的id。这甚至可能吗?
答案 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 );