私の簡略化されたテーブル構造は次のようになります。
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に適切なディレクトリですべてのメッセージを更新させる方法がわかりません。それも可能ですか?