|
把4,5列剔出重复石头,比82快4倍
SQL> @c:\downloads\testcte2
T.PATH||'*'||T2.PATH
------------------------------------------------------------------------------------------------------------------------------------------------------
,01,09,17,25,33,41,49,57,50,58,59,51,43,35,27,19,11,03,04,12,20,28,36,44,52,60*61,53,45,37,29,21,13,05,06,14,22,30,38,46,54,62,63,55,47,39,31,23,15,07
,08,16,24,32,40,48,56,64,
已用时间: 00: 00: 04.47
- wITH d AS (
- SELECT to_char(ROWNUM,'fm09') id
- ,CEIL(ROWNUM/8) r
- ,MOD(ROWNUM-1,8)+1 c
- ,ROWNUM val
- FROM DUAL
- CONNECT BY ROWNUM<=64
- )
- ,t(r,c,val,total,path) AS (
- SELECT r,c,val,val,','||CAST(id AS VARCHAR2(1000)) FROM d WHERE r=1 AND c=1
- UNION ALL
- SELECT d.r,d.c,d.val,d.val+t.total,t.path||','||d.id
- FROM t, d
- WHERE INSTR(t.path||',',','||d.id||',')=0
- AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c),(t.r,t.c+1),(t.r-1,t.c+1),(t.r+1,t.c+1))
- AND d.val+t.total<:M
- and t.c<4
- )
- ,t4ud (r,c,val,total,path)as (
- select r,c,val,total,path from
- (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,-2) order by length(path))rn from t where t.c=4)where rn=1 union all
- SELECT d.r,d.c,d.val,d.val+t.total total ,t.path||','||d.id path
- FROM t4ud t, d
- WHERE INSTR(t.path||',',','||d.id||',')=0
- AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c))
- AND d.val+t.total<:M)
- ,t4udd (r,c,val,total,path)as (
- select r,c,val,total,path from
- (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,-2) order by length(path))rn from t4ud t where t.c=4)where rn=1)
- ,t2(r,c,val,total,path) AS (
- SELECT r,c,val,val,CAST(id AS VARCHAR2(1000))||',' FROM d WHERE r=8 AND c=8
- UNION ALL
- SELECT d.r,d.c,d.val,d.val+t.total,d.id||','||t.path
- FROM t2 t, d
- WHERE INSTR(t.path||',',','||d.id||',')=0
- AND (d.r,d.c) IN ((t.r+1,t.c),(t.r-1,t.c),(t.r,t.c-1),(t.r+1,t.c-1),(t.r-1,t.c-1))
- AND d.val+t.total<:M
- and t.c>5
- )
- ,t5ud (r,c,val,total,path)as (
- select r,c,val,total,path from
- (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,1,2) order by length(path))rn from t2 t where t.c=5)where rn=1 union all
- SELECT d.r,d.c,d.val,d.val+t.total total ,d.id||','||t.path path
- FROM t5ud t, d
- WHERE INSTR(t.path||',',','||d.id||',')=0
- AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c))
- AND d.val+t.total<:M)
- ,t5udd (r,c,val,total,path)as (
- select r,c,val,total,path from
- (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,1,2) order by length(path))rn from t5ud t where t.c=5)where rn=1)
- SELECT /*+ ordered use_hash(t t2) */t.path||'*'||t2.path FROM t4udd t,t5udd t2
- WHERE (t.r=t2.r or t.r=t2.r-1 or t.r=t2.r+1)AND t.c=4 and t2.c=4+1
- AND t.total=:M-t2.total and rownum=1;
- ;
复制代码 |
|