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テーブルを更新し、DIRECTORYidを変更することで実現されます。準備されたディレクトリ構造は次のようになります。

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

そのため、2012年4月に受信したメッセージを、現在のユーザーのディレクトリ構造で2012という名前のディレクトリの子孫である04という名前のディレクトリに移動する必要があります。を使用して名前でディレクトリを検索します

name LIKE TO_CHAR(M.Received_time, 'MM')||'/'||EXTRACT(YEAR FROM M.Received_time)

カーソルを使用せずに、1つのUPDATEステートメントのすべてのメッセージのディレクトリを更新する方法はありますか?私はいくつかの相互に関連する更新を試しましたが、それらのどれも(いくつかの巨大なサブクエリがあっても)適切な解決策ではありません。

ステートメントは、メッセージ受信時間(これらの3つのテーブルの結合を要求します)と、適切な受信IDを持つMESSAGES_USERSテーブルのUPDATEDIRECTORYフィールドを使用して適切なディレクトリIDを取得する必要があります。

カーソルループを使用して1つのメッセージのIDを指定せずに、Oracleに適切なディレクトリですべてのメッセージを更新させる方法がわかりません。それも可能ですか?

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 に答える