数据库表有3列,Id,Name,ParentId,已从数据库读出数据,如何递归成一棵树?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库表有3列,Id,Name,ParentId,已从数据库读出数据,如何递归成一棵树?相关的知识,希望对你有一定的参考价值。

参考技术A 数据库是什么数据库?

我先假设你是 Oracle 吧。

CREATE TABLE test_tree (
test_id INT NOT NULL,
pid INT,
test_val VARCHAR(10),
PRIMARY KEY (test_id)
);

INSERT INTO test_tree VALUES(1, NULL, '.NET');
INSERT INTO test_tree VALUES(2, 1, 'C#');
INSERT INTO test_tree VALUES(3, 1, 'J#');
INSERT INTO test_tree VALUES(4, 1, 'ASP.NET');
INSERT INTO test_tree VALUES(5, 1, 'VB.NET');

INSERT INTO test_tree VALUES(6, NULL, 'J2EE');
INSERT INTO test_tree VALUES(7, 6, 'EJB');
INSERT INTO test_tree VALUES(8, 6, 'Servlet');
INSERT INTO test_tree VALUES(9, 6, 'JSP');

INSERT INTO test_tree VALUES(10, NULL, 'Database');
INSERT INTO test_tree VALUES(11, 10, 'DB2');
INSERT INTO test_tree VALUES(12, 10, 'mysql');
INSERT INTO test_tree VALUES(13, 10, 'Oracle');
INSERT INTO test_tree VALUES(14, 10, 'SQL Server');

INSERT INTO test_tree VALUES(15, 13, 'PL/SQL');
INSERT INTO test_tree VALUES(16, 15, 'Function');
INSERT INTO test_tree VALUES(17, 15, 'Procedure');
INSERT INTO test_tree VALUES(18, 15, 'Package');
INSERT INTO test_tree VALUES(19, 15, 'Cursor');

INSERT INTO test_tree VALUES(20, 14, 'T-SQL');

使用 START WITH CONNECT BY 语句实现树状查询

通过根节点 向下查询子节点

SELECT
LPAD(' ', 2*(LEVEL-1)) || test_val AS test_val
FROM
test_tree
START WITH
test_id IN (1, 6, 10)
CONNECT BY PRIOR test_id = pid;

TEST_VAL
-----------------------------------------------------------

.NET
C#
J#
ASP.NET
VB.NET
J2EE
EJB
Servlet
JSP
Database
DB2

TEST_VAL
-----------------------------------------------------------

MySQL
Oracle
PL/SQL
Function
Procedure
Package
Cursor
SQL Server
T-SQL

20 rows selected.追问

SqlServer数据库,用C#语言实现递归,已经从数据库查出所有的数据并保存在一个List中

数组转换为树树转换为数组

定义一个 `convert` 函数,将以下数组转换为树结构

const arr = [
     id: 1, name: \'部门A\', parentId: 0 , // 0 代表顶级节点,无父节点
     id: 2, name: \'部门B\', parentId: 1 ,
     id: 3, name: \'部门C\', parentId: 1 ,
     id: 4, name: \'部门D\', parentId: 2 ,
     id: 5, name: \'部门E\', parentId: 2 ,
     id: 6, name: \'部门F\', parentId: 3 ,
]

思路

遍历数组

每个元素 生成 tree node

找到 parentNode,并加入它的 children

如何找到 parentNode

遍历数组去查找,太慢

可用一个 Map 来维护关系,便于查找

找 parentNode 时,需要根据 `id` 能**尽快**找到 tree node

需要一个 map ,这样时间复杂度是 `O(1)` 。否则就需要遍历查找,时间复杂度高。

/**
 * @description array to tree
 */

interface IArrayItem 
    id: number
    name: string
  

以上是关于数据库表有3列,Id,Name,ParentId,已从数据库读出数据,如何递归成一棵树?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript扁平数组结构转换成JSON树形结构无限极forEachpushchildren

使用 vuejs / vuex 使用 ID 和 ParentId 分组数组

使用js将后台返回的数据转换成树形结构

数组转换为树树转换为数组

使用 Spring JDBC Rowmapper 映射分层数据

SQL Server 中的树结构数据查询