如何在层次结构中使用 oracle 查询获得此结果

Posted

技术标签:

【中文标题】如何在层次结构中使用 oracle 查询获得此结果【英文标题】:how to get this result using oracle query in hierarchical structure 【发布时间】:2014-07-19 22:34:02 【问题描述】:

首先,使用一个抵押品,您可以多次从银行借钱。这意味着一个抵押品_num有许多贷款_num。

其次,您可以为一笔贷款提供多种抵押品。意思是一个loan_num有多个condentral_num。

有一个像这样的表,名为 LOAN。

抵押品编号 |贷款号码 ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6 | A7 C7 | A7

我想从 LOAN 中获得最小的抵押品数量,如下表所示。 我将解释最小clooateral_num。 第一个表中有两组。其中一个是从第一排到第五排。然后,我们可以在第一组中找到一些类似C1→a5→c2→a1→c3→a3的关系。 我们丢弃包括'a'的节点。 结果 c1 将是 c1 c2 c3 中的最小 collat​​ral num。(因为 c1 的数量最少。)

在第二组(c6→a7→c7)中,最低抵押品数量为 c6。

抵押品编号 | minimum_collat​​eral_num |贷款号码 -------------------------------------------------- C1 | C1 | A5 C2 | C1 | A5 C2 | C1 | A1 C3 | C1 | A1 C3 | C1 | A3 C6 | C6 | A7 C7 | C6 | A7

如何进行 SQL 查询以生成我所说的结果。任何评论都会对我有所帮助。谢谢。

【问题讨论】:

听起来像是我宁愿实现编码,而不是 SQL 查询。 【参考方案1】:

我想我已经设法用分析函数做到了这一点(不是很优雅,但仍然如此)-

with
grps as(
    select marker
    from(
        select collateral_num,
               loan_num,
               rownum as marker,
               case when lead(loan_num,1) over (order by collateral_num) <> loan_num
                         and lead(collateral_num,1) over (order by collateral_num) <> collateral_num
                    then 1
                    when lead(loan_num,1) over (order by collateral_num) is null
                    then 1
                    else null end as grp
          from  loan
         order by collateral_num
        )
    where grp is not null
       )
, marked as(
    select loan.*, grps.*, row_number() over(partition by marker order by collateral_num) as splitter
    from loan, grps
           )
select  collateral_num,
        min(collateral_num) over (partition by marker) as min_collateral_num,
        loan_num
from    marked y
where   splitter <= marker
    and (splitter > (select max(x.marker) from marked x where x.marker < y.marker)
     or marker = (select min(marker) from marked))

请参阅http://sqlfiddle.com/#!4/cfb1a7/40/0 上的 sqlfiddle

【讨论】:

以上是关于如何在层次结构中使用 oracle 查询获得此结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在T-SQL中使用递归CTE获得完整的层次结构?

oracle ebs r12报告的Oracle flex值层次结构SQL查询

此查询的 Oracle 查询优化

浅谈oracle树状结构层级查询测试数据

Oracle编辑数据时提示:这些查询结果不可更新,请使用ROWI或者SELECT……FOR UPDATE获得可更新结果

如何忽略层次结构查询中特定类型的直接父级