【问题标题】:Recursive SELECT in OracleOracle 中的递归 SELECT
【发布时间】:2016-02-12 12:51:13
【问题描述】:

我有两张桌子:

表一

NumLig - CodPro - CodDer
901 - BSFX30 - 0140I18
898 - RSFX30 - 18
6 - MFLX - U

表二

NumLig - CodCmp - DerCmp - QtdUti - PerCmp
6 - MDFIB0008 - null - 1 - 2
6 - MDQDN0009 - null - 0,24 - 1
898 - MFLX - U - 0,942 - 2
898 - MDCAM0002 - 0,05 - 0
901 - RSFX - 18 - 1 - 2,5
901 - EDEAD0005 - 0,245 - 0

我需要的是搜索 BSFX30 - 0140I18 输出为:

MDFIB0008 - null - 1 - 2
MDQDN0009 - null - 0,24 - 1
MFLX - U - 0,942 - 2
MDCAM0002 - 0,05 - 0
RSFX - 18 - 1 - 2,5
EDEAD0005 - 0,245 - 0

如果我这样做:

SELECT E622SIM.CodPro, E622SIM.CodDer, E622DER.TipCpc, E622SIM.NumLig, E622DER.CodCmp, E622DER.DerCmp, E622DER.QtdUti, E622DER.PerCmp
FROM E622SIM
JOIN E622DER
ON E622SIM.NumLig = E622DER.NumLig

输出是所有数据,但我需要通过 CodPro 和 CodDer 过滤。如果我这样做:

SELECT E622SIM.CodPro, E622SIM.CodDer, E622DER.TipCpc, E622SIM.NumLig, E622DER.CodCmp, E622DER.DerCmp, E622DER.QtdUti, E622DER.PerCmp
FROM E622SIM
JOIN E622DER
ON E622SIM.NumLig = E622DER.NumLig

输出为:

RSFX - 18 - 1 - 2,5
EDEAD0005 - 0,245 - 0

但我需要:

MDFIB0008 - null - 1 - 2
MDQDN0009 - null - 0,24 - 1
MFLX - U - 0,942 - 2
MDCAM0002 - 0,05 - 0
RSFX - 18 - 1 - 2,5
EDEAD0005 - 0,245 - 0

这是因为 RSFX 是 BSFX30 的子代,而 MFLX 是 RSFX 的子代

谢谢!

【问题讨论】:

  • 你没有给我们任何工作。我们看到数据,是的。我们看不到它们之间的关系。
  • 从table_two中选择CodCmp、DerCmp、QtdUti、PerCmp;
  • 什么是“递归”?请编辑您的问题并添加有关您要完成的工作的更多详细信息。另外,请发布您已经编写的代码。谢谢。
  • 我编辑了问题试图解释。

标签: sql oracle


【解决方案1】:

我认为您需要查看有关 Hierarchical Queries 的文档 连接您的数据使用connect by,获取根元素-connect_by_root,通过根过滤您需要使用where connect_by_root(E622SIM.CodPro) = 'BSFX30'的元素

我试图将你的描述编译成脚本

create table E622SIM(NumLig int, CodPro varchar2(100), CodDer varchar2(100));

insert into E622SIM values (901, 'BSFX30', '0140I18');
insert into E622SIM values (898, 'RSFX30', '18');
insert into E622SIM values (6, 'MFLX', 'U');

create table E622DER (NumLig int, CodCmp varchar2(100), DerCmp varchar2(100), QtdUti varchar2(100), PerCmp varchar2(100));
insert into E622DER values(901, 'RSFX30',18,1,'2,5');
insert into E622DER values(901, 'EDEAD0005',0,245,0);
insert into E622DER values(898, 'MFLX','U','0,942',2);
insert into E622DER values(898, 'MDCAM0002',null,'0,05',0);
insert into E622DER values(6, 'MDFIB0008', null, 1, 2);
insert into E622DER values(6, 'MDQDN0009',null,'0,24',1);

这就是你所需要的查询

select E622DER.CodCmp
      ,E622DER.DerCmp
      ,E622DER.QtdUti
      ,E622DER.PerCmp
from E622DER
  left outer join E622SIM on E622SIM.NumLig = E622DER.NumLig
  where connect_by_root(E622SIM.CodPro)  in ('BSFX30')
   connect by prior E622DER.CodCmp = E622SIM.CodPro  
order by level desc, E622DER.CodCmp asc

    CODCMP  DERCMP  QTDUTI  PERCMP
1   MDFIB0008       1   2
2   MDQDN0009       0,24    1
3   MDCAM0002       0,05    0
4   MFLX    U   0,942   2
5   EDEAD0005   0   245 0
6   RSFX30  18  1   2,5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多