我在Oracle数据库中有两个表:document
和document_closure
。
文件:
- id
- name
- parent_id
document_closure:
- id
- parent_id
- child_id
- level
document
表有很多数据(10k~20k)。 document_closure
是空的。
问题:如何使用基于document_closure
表的数据填充document
表。什么sql脚本需要成为我的任务?
让我说我有这样的树。 示例:
A
|
- B
|
- C
文档表:
id | parent_id | name
1 | | A
2 | 1 | B
3 | 2 | C
最后 document_closure 必须是:
id | parent_id | child_id | level
1 | 1 | 1 | 0
2 | 2 | 2 | 0
3 | 3 | 3 | 0
4 | 1 | 2 | 1
5 | 2 | 3 | 1
6 | 1 | 3 | 2
答案 0 :(得分:2)
虽然 document_closure 中的 parent_id 和名称字段来自文档表,但您没有提及名称字段中的内容... 假设您可以对 name 字段使用相同(或null)的值,则只需要 INSERT INTO SELECT 语句,如下所示
INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition;
从文档表复制数据并将其插入document_closure表。在您的情况下,您只需要以下SQL:
INSERT INTO document_closure (id,parent_id) SELECT id,parent_id FROM document;
并且您将文档表中的所有记录复制到document_closure表中。
答案 1 :(得分:2)
可以使用Oracle的connect by
进行分层查询。这带来了许多方便的功能,包括level
来表示你的层次结构有多远,connect_by_root()
返回层次结构的根值(即顶层值)。
基于文档表生成数据的查询类似于:
WITH documents AS (SELECT 1 ID, NULL parent_id, 'A' NAME FROM dual UNION ALL
SELECT 2 ID, 1 parent_id, 'B' NAME FROM dual UNION ALL
SELECT 3 ID, 2 parent_id, 'C' NAME FROM dual)
-- end of mimicking a table with your sample data in it.
-- Since you already have this table, you don't need to bother defining the above subquery.
SELECT row_number() OVER (ORDER BY LEVEL, connect_by_root(ID), ID) ID,
connect_by_root(ID) parent_id,
ID child_id,
LEVEL -1 lvl
FROM documents d
CONNECT BY PRIOR ID = parent_id;
ID PARENT_ID CHILD_ID LVL
---------- ---------- ---------- ----------
1 1 1 0
2 2 2 0
3 3 3 0
4 1 2 1
5 2 3 1
6 1 3 2