0

我的树结构是在此处输入图像描述

我创建的数据库表是在此处输入图像描述

如何创建选择查询以获取树结构数据库表中任何特定节点的所有子节点。

例如我通过superior_emp_id = 1然后它返回{2,3,4,5,6,7}

4

4 回答 4

0
select * 
from employee 
where superior_emp_id = @emp_id  

union all  

select * 
from employee 
where superior_emp_id in (select emp_id 
                          from employee 
                          where superior_emp_id = @emp_id)
于 2013-12-13T06:50:34.477 回答
0
StringBuilder sql = new StringBuilder();
        sql.append("SELECT emp_id AS id, ");
        sql.append("  emp_name AS employeeName, ");
        sql.append("  title AS title, ");
        sql.append("  superior_emp_id AS parentId ");
        sql.append(" FROM T_NWM_SRVC ");
        sql.append(" WHERE superior_emp_id IS NOT NULL ");
        sql.append(" AND superior_emp_id  =");
        sql.append(parentId);

在传递parentId : 1时,您将检索 2,3。要获取 2,3 的子节点,您将不得不再次进行服务器调用(一种延迟加载)。希望这是您正在寻找的。

于 2013-12-13T07:00:23.547 回答
0

那么你可以在这里使用嵌套查询和集合,

您可以尝试以下查询来获取根节点的子节点:

select *
from TABLE_NAME
where senior_emp_id in { select emp_id
                         from TABLE_NAME
                         where senior_emp_id = 1 || emp_id = 1 }

同样,如果您希望在嵌套查询中使用 2 代替 1,如果您希望拥有父节点 -2 的子节点

让我知道它是否运作良好..

于 2013-12-13T06:59:55.427 回答
0

我认为你不能用一个 sql 语句来做到这一点。我会尝试实现一个递归函数,如果有更多的孩子并附加它们,它会查询一组给定的 id。普罗萨:

function List<Integer> getChilds(int[] ids)
{  
List<Integer> returnValue = new ArrayList();
if(ids.length = 0)
    return returnValue;

foreach int id : ids
{
    //Build sql to get childs an execute it
    int[] childidsfromsql = em.createQuery("...").getResultList();..
    returnValue.addAll(getChilds(childidsfromsql))
}
 return returnValue;
}
于 2013-12-16T07:56:29.853 回答