0

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

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 在不使用游标循环指定一条消息的 id 的情况下使用适当的目录更新每条消息。这甚至可能吗?

4

1 回答 1

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 );
于 2012-06-20T14:37:39.467 回答