|
帮楼主改改:
WITH TMP00 AS(SELECT -1 SEED FROM DUAL UNION SELECT -2 FROM DUAL UNION SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL),
TMP02 AS(
SELECT STATUS,SUBSTR(STATUS,LEVEL,1) SON,LEVEL ID,4 INS
FROM (SELECT 'FFF_GGG' STATUS FROM DUAL)
CONNECT BY LEVEL<=LENGTH(STATUS)
),
TMP03(SON,ID,LEV,INS,STATUS,PATH) AS(
SELECT T2.SON,T2.ID,1 LEV,INS,STATUS,CAST(STATUS AS VARCHAR2(4000)) PATH FROM TMP02 T2
UNION ALL
SELECT X.COLUMN_VALUE,
T3.ID,T3.LEV+1,T3.INS+T0.SEED,
listagg(X.COLUMN_VALUE) WITHIN GROUP(ORDER BY T3.ID) over(partition by T3.LEV+1,T3.INS+T0.SEED,T0.SEED,t3.path),
T3.PATH||'-->'||listagg(X.COLUMN_VALUE) WITHIN GROUP(ORDER BY T3.ID) over(partition by T3.LEV+1,T3.INS+T0.SEED,T0.SEED,t3.path)
FROM TMP03 T3, TMP00 T0
,TABLE(CAST(MULTISET(SELECT CASE WHEN T3.SON<>'_' AND T3.ID=T3.INS+T0.SEED THEN '_'
WHEN T3.SON='_' AND T0.SEED>0 AND T3.INS+T0.SEED<=7 AND SUBSTR(T3.STATUS,T3.INS+T0.SEED,1)='G' THEN 'G'
WHEN T3.SON='_' AND T0.SEED<0 AND T3.INS+T0.SEED>=1 AND SUBSTR(T3.STATUS,INS+T0.SEED,1)='F' THEN 'F'
ELSE T3.SON
END FROM DUAL) AS SYS.ODCIVARCHAR2LIST)) X
WHERE T3.INS+T0.SEED>=1 AND T3.INS+T0.SEED<=7 AND ((T0.SEED>0 AND SUBSTR(T3.STATUS,T3.INS+T0.SEED,1)='G')
or (T0.SEED<0 AND SUBSTR(T3.STATUS,INS+T0.SEED,1)='F'))
)
SELECT DISTINCT LEV-1 steps,path FROM TMP03 where status='GGG_FFF';
他这个解法规定了青蛙只能朝一个方向跳,似乎还有些道理。 |
|