Sql 我怎样才能摆脱';ORA-01489:字符串串联的结果太长';在这个查询中?

Sql 我怎样才能摆脱';ORA-01489:字符串串联的结果太长';在这个查询中?,sql,oracle,optimization,Sql,Oracle,Optimization,此查询获取网络中的支配集。例如,给定一个网络 AB BC BD CE DC DE FE 它返回 B、 E B、 F A、 E 但它不适用于大数据,因为我在结果中使用了字符串方法。我一直试图删除string方法并返回一个视图或其他东西,但没有效果 With t as (select 'A' as per1, 'B' as per2 from dual union all select 'B','C' from dual union all select 'B',

此查询获取网络中的支配集。例如,给定一个网络

AB
BC
BD
CE
DC
DE
FE

它返回
B、 E
B、 F
A、 E
但它不适用于大数据,因为我在结果中使用了字符串方法。我一直试图删除string方法并返回一个视图或其他东西,但没有效果

With t as (select 'A' as per1, 'B' as per2 from dual union all
         select 'B','C' from dual union all
         select 'B','D' from dual union all
         select 'C','B' from dual union all
         select 'C','E' from dual union all
         select 'D','C' from dual union all
         select 'D','E' from dual union all
         select 'E','C' from dual union all
         select 'E','D' from dual union all
         select 'F','E' from dual)
 ,t2 as (select distinct least(per1, per2) as per1, greatest(per1, per2) as per2 from t union
       select distinct greatest(per1, per2) as per1, least(per1, per2) as per1 from t)
 ,t3 as (select per1, per2, row_number() over (partition by per1 order by per2) as rn from t2)
 ,people as (select per, row_number() over (order by per) rn
             from (select distinct per1 as per from t union
                   select distinct per2 from t)
            )
  ,comb   as (select sys_connect_by_path(per,',')||',' as p
              from   people
              connect by rn > prior rn
             )
  ,find   as (select p, per2, count(*) over (partition by p) as cnt
             from (
                   select distinct comb.p, t3.per2
                   from   comb, t3
                   where  instr(comb.p, ','||t3.per1||',') > 0 or instr(comb.p, ','||t3.per2||',') > 0
                  )
            )
 ,rnk as (select p, rank() over (order by length(p)) as rnk
          from find
          where cnt = (select count(*) from people)
          order by rnk
         )  select distinct trim(',' from p) as p from rnk  where rnk.rnk = 1`

根据我的经验,您不希望在大型、复杂的查询中执行复杂的字符串处理,而此查询相当复杂。我想,重新思考和采用不同的方法,而不是优化现有的查询,可以很好地解决这个问题


底层表是什么样子的?您到底想要实现什么?是否可以更改数据模型?

Oracle的一个限制是SQL无法处理大于4000个字符的VARCHAR2。如果您试图返回超过此大小的字符串,它将抛出ORA-01489。理想情况下,您应该尝试将结果集分解为多个小行。或者,您可以将其作为CLOB返回

编辑

我如何将上述内容作为CLOB返回

仔细查看了您的代码后,我认为唯一会抛出ORA-1489的地方是这一行:

select sys_connect_by_path(per,',')||',' as p
from   people
中将该调用包装到\u CLOB()
将很容易。不幸的是,将P转换为CLOB会破坏一些后续处理('distinct P
按P`)所以它可能不是一个选项。对不起

至于其他解决办法

您的站点是否拥有Oracle Spatial的许可证?我知道没有多少网站会这样做,但如果你的网站是幸运的(而且你使用的是10gR2或更高版本),那么你应该去看看


否则,如果无法限制
sys\u connect\u by\u path()
调用的输出,则可能需要在PL/SQL中实现这一点。您可以使用返回最终输出,这样您仍然可以从SELECT语句调用它。

CLOB?,我如何将上述内容作为CLOB返回。请解释以上所示的数据AB、BC….是基础数据。它们代表了一种用户和朋友的关系。我试图找到这个给定网络中的最小支配集最小支配集,在社交网络中,是一组与网络中的每个人都是朋友的人。有关支配集的更多信息,请参见: