一尘不染

Oracle中的递归查询

sql

我对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不断变化,我很难弄清楚它。


阅读 128

收藏
2021-05-05

共1个答案

一尘不染

在Oracle中,使用以下方法很容易 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 withconnect 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
2021-05-05