我对PLSQL的更高级主题还是陌生的,因此希望有人可以帮助我。
问题: 我有一个表,其中包含管理员和用户之间发送的消息。该表在同一表的message_id字段中具有带FK的message_parent:如果填充了该字段,则意味着该消息是作为对先前消息的答复而发送的。我需要选择属于同一对话的所有消息并显示它们。可以通过单个查询完成此操作,还是需要一个过程来处理这种逻辑?据我了解,它必须是递归的,因为我正在搜索的message_id总是在变化
**消息表示 例 :
|message_id|parent_id|message_content| |----------|---------|---------------| |101 |100 | foo | |100 |97 | bar | |99 |(null) | Left out | |97 |(null) | baz |
因此,选择message_content的正确查询应返回“ baz”,“ bar”和“ foo”,但不返回“ Left out”(因为baz是原始消息)。如果只有两个消息可以绑定在一起,或者有一个thread_id列可以将所有消息链接到同一个“线程”中,那么这将很简单,但是随着parent_id不断变化,我很难弄清楚它。
在Oracle中,使用以下方法很容易 CONNECT BY
CONNECT BY
select message_id, parent_id, message_content from messages start with message_id = 97 -- this is the root of your conversation connect by prior message_id = parent_id;
这使树从上到下走动。
如果要将树从一条消息移到根,请更改start with和connect by部分:
start with
connect by
select message_id, parent_id, message_content from messages start with message_id = 100 -- this is the root of your conversation connect by prior parent_id = message_id; -- this now goes "up" in the tree