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

Sql 如何在层次结构中使用oracle查询获得此结果,sql,database,oracle,Sql,Database,Oracle,首先,有了一个抵押品,你就可以从银行借很多次钱。这意味着一个抵押品有很多贷款 第二,你可以为一笔贷款提供许多抵押品。这意味着一笔贷款有许多抵押品 有一个类似这样的表,名为LOAN collateral_num | loan_num ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6

首先,有了一个抵押品,你就可以从银行借很多次钱。这意味着一个抵押品有很多贷款

第二,你可以为一笔贷款提供许多抵押品。这意味着一笔贷款有许多抵押品

有一个类似这样的表,名为LOAN

collateral_num | loan_num ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6 | A7 C7 | A7 我想从贷款中获得最低担保金额,如下表所示。 我会向你解释你的秘密。 第一张表中有两组。其中一个是从第一排到第五排。然后,我们可以找到像C1这样的关系→a5→c2→a1→c3→第一组为a3。 我们丢弃了包含“a”的节点。 因此,c1将是c1中的最小项圈数。因为c1的项圈数最少

第二组为c6→a7→C7最小项圈数为c6

collateral_num | minimum_collateral_num | loan_num -------------------------------------------------- C1 | C1 | A5 C2 | C1 | A5 C2 | C1 | A1 C3 | C1 | A1 C3 | C1 | A3 C6 | C6 | A7 C7 | C6 | A7
如何进行SQL查询以生成我所告诉的结果。任何评论都会对我有帮助。谢谢。

我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但无论如何-

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))

请参见位于

的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-

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))

请参见位于

的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-

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))

请参见位于

的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-

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))

请参见

中的sqlfiddle,听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。