数据库表有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 分组数组