【问题标题】:Create custom Function or Stored Procedure创建自定义函数或存储过程
【发布时间】:2014-02-20 21:02:32
【问题描述】:

我有一个Hierarchy 表,其中包含Master_idSub_id

sub_id Master_id
2      1
3      2
4      1
5      3
6      7

我想创建一个迭代函数或存储过程(我不确定我以前从未使用过它们中的任何一个)来再创建一个列给我primary_master_Column (PMC)

sub_id Master_id PMC
2      1         1
3      2         1
4      1         1
5      3         1
6      7         7

【问题讨论】:

  • 我不清楚你想要什么。
  • 抱歉,我重命名了表中的列。在我的表中,3 是 2 的子公司。但 2 又是 1 的子公司。所以我想要一个单独的列来列出层次结构顶部的 id。希望现在很清楚

标签: sql oracle plsql oracle11g oracle-sqldeveloper


【解决方案1】:
select
  Master_id, sub_id, 
  max(PMC) keep(dense_rank first order by lev desc) as PMC
from
(
select 
  sub_id as PMC, level lev, 
  connect_by_root(Master_id) as Master_id,
  connect_by_root(sub_id) as sub_id
from your_table
connect by prior sub_id = Master_id
)
group by Master_id, sub_id

fiddle

【讨论】:

  • 非常感谢您的帮助
【解决方案2】:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE test (sub_id, Master_id) AS
          SELECT 2,      1 FROM DUAL
UNION ALL SELECT 3,      2 FROM DUAL
UNION ALL SELECT 4,      1 FROM DUAL
UNION ALL SELECT 5,      3 FROM DUAL
UNION ALL SELECT 6,      7 FROM DUAL;

查询 1

SELECT t.sub_id,
       t.master_id,
       CONNECT_BY_ROOT( t.master_id ) AS PMC
FROM   test t
       LEFT OUTER JOIN
       test x
       ON ( t.master_id = x.sub_id )
START WITH x.sub_id IS NULL
CONNECT BY PRIOR t.sub_id = t.master_id

Results

| SUB_ID | MASTER_ID | PMC |
|--------|-----------|-----|
|      2 |         1 |   1 |
|      3 |         2 |   1 |
|      5 |         3 |   1 |
|      4 |         1 |   1 |
|      6 |         7 |   7 |

查询 2

SELECT t.sub_id,
       t.master_id,
       CONNECT_BY_ROOT( t.master_id ) AS PMC
FROM   test t
START WITH NOT EXISTS ( SELECT 'x' FROM test x WHERE t.master_id = x.sub_id )
CONNECT BY PRIOR t.sub_id = t.master_id

Results

| SUB_ID | MASTER_ID | PMC |
|--------|-----------|-----|
|      2 |         1 |   1 |
|      3 |         2 |   1 |
|      5 |         3 |   1 |
|      4 |         1 |   1 |
|      6 |         7 |   7 |

【讨论】:

  • 感谢您抽出宝贵的时间。我将尝试使用 CONNECT BY 来解决此问题
  • 您能解释一下为什么您使用 PRIOR DBMS_RANDOM.VALUE IS NOT NULL 条件吗??谢谢,AVG
  • 数据中是 used to stop loops - 当我编写查询的初稿时,有必要包含它,但我随后在 START WITH 语句中添加了,现在 AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL 是多余的并且可以删除。我会从答案中编辑出来以免混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2011-01-31
  • 2016-09-24
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多