Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根组。但是,我需要分别检查每个级别,以了解给定成员组的成员_值是否可以与根据该级别限制检查的成员_值之和一起计算。顺便说一句:我不知道我可以在另一个CTE中使用一个CTE,太棒了,谢谢!我不想使用CTE,因为它们不能直接嵌套。对不起@demo,我忘了这一点_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 根组。但是,我需要分别检查每个级别,以了解给定成员组的成员_值是否可以与根据该级别限制检查的成员_值之和一起计算。顺便说一句:我不知道我可以在另一个CTE中使用一个CTE,太棒了,谢谢!我不想使用CTE,因为它们不能直接嵌套。对不起@demo,我忘了这一点

Sql 根组。但是,我需要分别检查每个级别,以了解给定成员组的成员_值是否可以与根据该级别限制检查的成员_值之和一起计算。顺便说一句:我不知道我可以在另一个CTE中使用一个CTE,太棒了,谢谢!我不想使用CTE,因为它们不能直接嵌套。对不起@demo,我忘了这一点,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,根组。但是,我需要分别检查每个级别,以了解给定成员组的成员_值是否可以与根据该级别限制检查的成员_值之和一起计算。顺便说一句:我不知道我可以在另一个CTE中使用一个CTE,太棒了,谢谢!我不想使用CTE,因为它们不能直接嵌套。对不起@demo,我忘了这一点。我现在不在计算机附近,但这只是检查合格组子查询中是否存在属于组的层次结构成员。我会在可能的时候更新答案。好的,我很期待,因为我自己仍然不知道如何才能做到。请注意,这些级别可以比3个级别更深,而且每个级别可以包含任意数量的组。哇,尽管这很疯狂,


根组。但是,我需要分别检查每个级别,以了解给定成员组的成员_值是否可以与根据该级别限制检查的成员_值之和一起计算。顺便说一句:我不知道我可以在另一个CTE中使用一个CTE,太棒了,谢谢!我不想使用CTE,因为它们不能直接嵌套。对不起@demo,我忘了这一点。我现在不在计算机附近,但这只是检查合格组子查询中是否存在属于组的层次结构成员。我会在可能的时候更新答案。好的,我很期待,因为我自己仍然不知道如何才能做到。请注意,这些级别可以比3个级别更深,而且每个级别可以包含任意数量的组。哇,尽管这很疯狂,但它似乎确实可以正常工作!!(不知道性能方面的问题,但这并不是我的OP中真正的问题)。你也给了我一些新的见解,对此我很感激。如果其他人未使用R/CTE发布正确答案,我将不得不更改已接受的答案,因为OP。非常感谢,这很疯狂,但也很棒:D@Demo如果“没有CTE”解决方案,请写信给我。因为现在我觉得这是不可能的。(尽管昨天和“R/CTE”似乎不现实)。
CREATE TABLE "MYGROUPS" 
(   
"MYGROUP_ID" VARCHAR2(20 BYTE), 
"MYGROUP_LIMIT" Number, 
"MEMBER" VARCHAR2(20 BYTE), 
"MEMBER_VALUE" Number
);

insert into mygroups
(Select 'g0'  ,1  ,'00'  ,1 from dual) union
(Select 'g1'  ,5  ,'01'  ,1 from dual) union
(Select 'g1'  ,5  ,'02'  ,1 from dual) union
(Select 'g1'  ,5  ,'03'  ,1 from dual) union
(Select 'g1'  ,5  ,'g2'  ,3 from dual) union
(Select 'g2'  ,3  ,'02'  ,2 from dual) union
(Select 'g2'  ,3  ,'05'  ,2 from dual) union
(Select 'g2'  ,3  ,'g3'  ,2 from dual) union
(Select 'g3'  ,5  ,'03'  ,1 from dual) union
(Select 'g3'  ,5  ,'05'  ,1 from dual)
insert into mygroups
(Select 'g0'  ,1  ,'00'  ,1 from dual) union
(Select 'g1'  ,5  ,'01'  ,1 from dual) union
(Select 'g1'  ,5  ,'02'  ,1 from dual) union
(Select 'g1'  ,5  ,'03'  ,1 from dual) union
(Select 'g1'  ,5  ,'g2'  ,3 from dual) union
(Select 'g2'  ,3  ,'02'  ,1 from dual) union
(Select 'g2'  ,3  ,'05'  ,1 from dual) union
(Select 'g2'  ,3  ,'g3'  ,2 from dual) union
(Select 'g3'  ,5  ,'03'  ,1 from dual) union
(Select 'g3'  ,5  ,'05'  ,1 from dual)
select connect_by_root mygroup_id as root, mygroups.*,level
from ( Select mygroups.*,
             sum(member_value) over (partition by mygroup_id) sum_of_values,
             CASE 
                  WHEN sum (CASE WHEN member like 'g%' THEN 1 END) over (partition by mygroup_id) > 0 THEN 'DUNNO'
                  WHEN sum(member_value) over (partition by mygroup_id) >= mygroup_limit THEN 'OK'
                  WHEN sum(member_value) over (partition by mygroup_id) < mygroup_limit THEN 'NOT OK'
             END eval
        From mygroups ) mygroups
connect by prior member = mygroup_id
with all_hierarchies as (
 select member_value
      , connect_by_root mygroup_id as starting_group
      , connect_by_root mygroup_limit as starting_group_limit
   from mygroups m
connect by prior member = mygroup_id
        )
select starting_group
  from all_hierarchies
 group by starting_group
having sum(member_value) >= min(starting_group_limit)
with all_hierarchies as (
 select member_value
      , connect_by_root mygroup_id as starting_group
      , connect_by_root mygroup_limit as starting_group_limit
   from mygroups m
connect by prior member = mygroup_id
        )
, qualifying_groups as (
select starting_group
  from all_hierarchies
 group by starting_group
having sum(member_value) >= min(starting_group_limit)
       )
select a.*
  from all_hierarchies a
  join qualifying_groups q
    on a.starting_group = q.starting_group
with GRP as (
     select A.*, row_number() over (order by L) N
       from (
         select mygroup_id, min(level) L
           from  mygroups m
          start with not exists(select 1 from mygroups m2
                                 where m2.mygroup_id=m.mygroup_id and m2.member like 'g%'
                               )
        connect by member=prior mygroup_id
          group by mygroup_id
       ) A
),
Cursor_tab(mygroup_id,N,list,result) as(
   select NULL,N,lpad(',',2000),0
     from GRP where N=1
 union all
   select G.mygroup_id,Q.N+1,
          ltrim(Q.list)||decode(R.column_value,0,'',G.mygroup_id||','),
          TO_NUMBER(R.column_value)
     from Cursor_tab Q, GRP G,
          table(cast(multiset(
           select decode(sign(sum(member_value)-min(mygroup_limit)),-1,0,1)
             from mygroups m
            where m.mygroup_id=G.mygroup_id
              and (member not like 'g%' or Q.list like '%,'||member||',%')
          ) as sys.odcivarchar2list)) R
    where G.N=Q.N
)
select mygroup_id, decode(result,1,'OK','NOT OK')
  from Cursor_tab
 where mygroup_id is not null