|
〇〇 发表于 2014-10-16 18:40 ![]()
改成递归就快了
with a as(select '21218453415461109221'a from dual), --75059993789508200000
b as( ...
您这个是最快的, 
如果我偷用你的递归, 速度跟这个差不多。 
WITH A AS (SELECT '21218453415461109221' A FROM DUAL )
,T0 AS (
SELECT LEVEL L
,SUBSTR(A,LEVEL,1) C
FROM A
CONNECT BY LEVEL <= LENGTH(A)
)
,T1 AS (
SELECT DISTINCT TO_NUMBER(REPLACE(SYS_CONNECT_BY_PATH(C,','),',','')) N
FROM T0
CONNECT BY LEVEL <= 20 AND L = PRIOR L+1
)
,T AS (
SELECT distinct N
FROM (SELECT N , FLOOR(N/2) SHR1 FROM T1)
WHERE N = 0 OR N + SHR1 - 2 * BITAND(N,SHR1) IN (SELECT POWER(2,LEVEL)-1 FROM DUAL CONNECT BY LEVEL <= 20)
)
,s(lv,n,s) as(select 1 lv,to_char(n),0+n s from t,a where a like n||'%'
union all
select 1+lv,to_char(s.n)||to_char(t.n),s+t.n from s,t,a where a like to_char(s.n)||to_char(t.n)||'%'and lv<6)
SELECT *
FROM s,a
where lv=6 and length(n)=length(a) and ROWNUM <= 1 ;
|
|