孩子找父亲 ,父亲找孩子的写法

本文介绍了一种使用Oracle SQL函数实现的数据表中父子关系查询的方法。包括孩子找父亲(从子节点追溯到父节点)及父亲找孩子(从父节点查找所有子节点)的查询算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---今天面试 一面试官说写出孩子找父亲,父亲找孩子的算法 我就试了下

 

 

 

1 孩子找父亲

 

scott@ORCL> select * from ms
  2  /

ASSEMBLY_ITEM_NO     COMPONENT_ITEM_NO      QUANTITY
-------------------- -------------------- ----------
A                    A1                            1
A                    A2                            1
A1                   A11                           1
A1                   A12                           1
A2                   A21                           1
A2                   A22                           1

已选择6行。

 

 

create or replace function fun_jd(v_COMPONENT_ITEM_NO ms.component_item_no%type) return varchar2
as
res varchar2(1000):='';
str1 varchar2(100);
str2 varchar2(100);
str3 varchar2(100);
n number:=0;
begin
str1:=v_COMPONENT_ITEM_NO;
str3:=str1;
loop
n:=n+1;----控制在12层
begin
select ASSEMBLY_ITEM_NO into str2 from ms where COMPONENT_ITEM_NO=str1;
res:=res||','||str2;
str1:=str2;
exit when n>12;
exception
when others then
null;
end;
exit when n>12;
end loop;
res:=str3||res;
return res;
end;

 

Function created
 
SQL> select fun_jd('A22') FROM DUAL
  2  /
 
FUN_JD('A22')
--------------------------------------------------------------------------------
A22,A2,A
 

 

 

2 父亲找孩子

scott@ORCL> create or replace function func_jd3(v_COMPONENT_ITEM_NO ms.component_item_no%type)
  2  return varchar2
  3  as
  4  res varchar2(1000);
  5  str1 varchar2(500);
  6  N NUMBER:=0;
  7  begin
  8  str1:=v_COMPONENT_ITEM_NO;
  9  WHILE N<=12 loop
 10  N:=N+1;
 11  BEGIN
 12  res:=res||','||str1;
 13  select wm_concat(a.component_item_no) INTO str1
 14  from ms a where instr(','||str1||',',','||ASSEMBLY_ITEM_NO||',')>0;
 15  exception
 16  when no_data_found then
 17  EXIT;
 18  END;
 19  end loop;
 20  return rtrim(ltrim(RES,','),',');
 21  end;
 22  /

函数已创建。

scott@ORCL> select replace(func_jd3('A1'),',',chr(10)) FROM DUAL
  2  /

REPLACE(FUNC_JD3('A1'),',',CHR(10))
--------------------------------------------------------------------------------
A1
A11
A12

 

 

---如有什么不很完美的地方,您有更合适的就请您提出谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值