tau*_*kam 3 sql oracle connect-by recursive-query oracle12c
我是PLSQL更高级主题的新手,所以希望有人可以帮助我.
问题: 我有一个表,其中包含管理员和用户之间发送的消息.该表有一个带有FK的message_parent到同一个表message_id字段:如果填充了该字段,则表示该消息是作为对前一个消息的回复发送的.我需要选择属于同一个对话的所有消息并显示它们.这可以通过单个查询完成,还是需要一个程序来处理这种逻辑?据我所知,它需要递归,因为我正在搜索的message_id总是在变化
示例 消息表:
|message_id|parent_id|message_content|
|----------|---------|---------------|
|101 |100 | foo |
|100 |97 | bar |
|99 |(null) | Left out |
|97 |(null) | baz |
Run Code Online (Sandbox Code Playgroud)
所以选择message_content的正确查询应该返回"baz","bar"和"foo"而不是"left out"(因为baz是原始消息).如果只有两个消息可以捆绑在一起,或者例如一个thread_id列,它会链接同一个'线程'中的所有消息,但是随着parent_id的不断变换,我很难解决它.
在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;
Run Code Online (Sandbox Code Playgroud)
这从上到下走树.
如果要将树从单个消息传递到根,请更改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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |