如何为 Oracle 11g 中分层表的每条记录分配父组 ID?

Posted

技术标签:

【中文标题】如何为 Oracle 11g 中分层表的每条记录分配父组 ID?【英文标题】:How to assign the Parent Group IDs to each record of a hierarchical table in Oracle 11g? 【发布时间】:2014-06-07 10:31:48 【问题描述】:

根据 TECH_VALUES 表中存在的以下示例分层数据,我如何创建一个视图,例如 TECH_VALUES_VW,它将采用相同的数据但有一个附加列,即 GROUP_ID_PARENT,它将显示父组所在的组 ID id 为 0 对子所属的行,请参阅新列数据示例:

ID      GROUP_ID      LINK_ID      PARENT_GROUP_ID      TECH_TYPE  GROUP_ID_PARENT
------- ------------- ------------ -------------------- ---------- --------------- 
1       100           LETTER_A     0                               100
2       200           LETTER_B     0                               200
3       300           LETTER_C     0                               300
4       400           LETTER_A1    100                  A          100               
5       500           LETTER_A2    100                  A          100               
6       600           LETTER_A3    100                  A          100               
7       700           LETTER_AA1   400                  B          100              
8       800           LETTER_AAA1  700                  C          100             
9       900           LETTER_B2    200                  B          200               
10      1000          LETTER_BB5   900                  B          200              
12      1200          LETTER_CC1   300                  C          300
13      1300          LETTER_CC2   300                  C          300
14      1400          LETTER_CC3   300                  A          300
15      1500          LETTER_CCC5  1400                 A          300
16      1600          LETTER_CCC6  1500                 C          300
17      1700          LETTER_BBB8  900                  B          200
18      1800          LETTER_B     0                               1800
19      1900          LETTER_B2    1800                 B          1800               
20      2000          LETTER_BB5   1900                 B          1800              
21      2100          LETTER_BBB8  1900                 B          1800

所以基于以上,我想取表定义:

Table Name: TECH_VALUES:
    ID,
    GROUP_ID,
    LINK_ID
    PARENT_GROUP_ID,
    TECH_TYPE

并创建一个新视图

View Name: TECH_VALUES_VW:
        ID,
        GROUP_ID,
        LINK_ID
        PARENT_GROUP_ID,
        TECH_TYPE,
        GROUP_ID_PARENT

基于 TECH_VALUES 表中的上述示例数据。

我希望创建一个新查询来构建这个新视图,该视图将只使用每行 0 的 PARENT_GROUP_ID 的 GROUP_ID。

更新

如果我只取出 TECH_VALUES 表中 PARENT_GROUP_ID 为 0 的记录,即让事情变得更清楚,我所追求的是什么,即

ID      GROUP_ID      LINK_ID      PARENT_GROUP_ID     
------- ------------- ------------ --------------------
1       100           LETTER_A     0                   
2       200           LETTER_B     0                   
3       300           LETTER_C     0                   
18      1800          LETTER_B     0                  

仅使用这 4 条记录的 GROUP_ID 值,将此 GROUP_ID 作为 TECH_VALUES_VW 中的新列分配给每个父链接 ID 的所有子记录以及原始链接 ID(其中 PARENT_GROUP_ID 为 0)如上面的示例数据集所示。

【问题讨论】:

这个不清楚。我明白当父组 id 为 0 时你想要什么,但当它是其他东西时不明白。 Dan,请查看我对原始线程的更新 - 希望它更清晰。 How to Perform Counts on a Oracle Hierarchical Table based on Parent Link的可能重复 【参考方案1】:

如果我正确理解了您的问题,那么这可能就是您所追求的:

CREATE OR REPLACE VIEW tech_values_vw
AS
SELECT TV.*,
    CASE WHEN LEVEL = 1 THEN group_id ELSE connect_by_root(group_id) END AS group_id_parent
FROM tech_values TV
START WITH parent_group_id = 0
CONNECT BY PRIOR group_id = parent_group_id
;

【讨论】:

以上是关于如何为 Oracle 11g 中分层表的每条记录分配父组 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何为mysql中的每条记录检索表中的两条记录

如何为数据库表中的每条记录生成一个id?

通过比较sql server中同一张表的每条记录返回重复

如何获取自引用表的每条记录的所有子项

在反应状态引擎中,如何为结果表的每一行生成唯一的 UUID?

Oracle SQL 排名查询