单个查询从分层表中获取所有记录

时间:2016-03-02 17:29:02

标签: sql oracle performance oracle11g

我有一个用于博客帖子的线程评论的分层表,我需要根据给定的查询过滤器获取一组记录。 表结构就像这样

ID, PARENTID, APPROVEDSTATUS, COMMENTSTATUS, COMMENTORID, MODERATORID....

博客的第一条评论将有parentid = 0.评论会经过审核过程,其中主持人(可以是博客所有者)可以突出显示其他版主的评论,或者他们可以回复。然后,指导者可以回复博客所有者的任何回复,然后链可以继续。

我需要在java运行页面中显示所有博客的所有评论列表。该页面允许用户根据评论状态,该博客的星级评分,该评论的投票数等过滤显示的记录。其中一些过滤器适用于主评论,一些适用于每个子级别。 我最初是如何做到这一点的我是第一级评论,并迭代每个以查看孩子的孩子和孩子,以便易于以线程格式显示。 应用过滤器时会出现问题。当我在主级别上应用过滤器时,例如,其中commentstatus是“突出显示”注释,这将返回0记录,因为此状态位于子级别。同样,星级评级在父级别。 有没有办法可以获取所有记录并应用过滤条件,然后按正确顺序。

PRIMARY QUERY: 

    select id, parentid, approvedstatus, 
           commentstatus, personname, 
           actiontime 
     from v_comment_tree where parentCommentid=0;

QUERY 2:

select id, parentid, approvedstatus, commentstatus, 
       personname, actiontime 
  from v_comment_tree 
 where parentCommentid=40611 
   and commentstatus = 'flag';

通过从第一条评论传递id来触发查询2。

[Java部分]

public CommentList getBlogComments(){
  /* get the filters from the request if any and built where clause.
     On loading first time there will be no filters*/
   filter1 = " and commentstatus = 'flag'"; 
   filter2 = " and rate = 5";
   /* execute the query by adding these filters to the original query and iterate over the loop and add the result to the CommentList. 
      This is the parentid. */
   /* check if this id has children. For this I call another function passing this id */
     getSubBlogComments(id, filter1+filter2);

   return CommentList;
}

private void getSubBlogComments(id, String filters){
   /* here I execute Query 2 by applying the same filter 
   and iterate over the loop and add the result to the CommentList. 
      This is the parentid. */
   /* check if this id has children. With this I again call this function passing this id */

     getSubBlogComments(id, filters);

}

由于在第一次查询时应用过滤器而导致我没有结果,因此我无法从可能存在标记状态的记录的子项获取结果时出现问题。如果有一个查询将以正确的顺序获取父子记录并将筛选器应用于整个结果。即使这样,也存在这个问题。如果我得到子记录,我需要获取原始父级并根据该子记录显示整个线程。我应该写一个程序吗?

1 个答案:

答案 0 :(得分:0)

这可以通过一系列匿名观点'所有评论'来完成。将从根节点开始获取线程中的注释列表。我认为在sql中完成它比在java中完成更好,因为这样做很容易。

--this will get all the comments in the thread starting at parent = 0
with allcomments as 
  (select 
     id, parentid, approvedstatus, commentstatus, personname, actiontime
   from v_comment_tree
   start with
     parentCommentid=0 
   connect by prior id = parentCommentid)
select * from allcomments where <your filter conditions here>