使用基于其他表的数据填充表格?

时间:2018-01-09 13:57:31

标签: sql oracle oracle11g

我在Oracle数据库中有两个表:documentdocument_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

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