|
本帖最后由 newkid 于 2011-9-29 05:05 编辑
上面有BUG,每两位都不能相同。
WITH p AS (
SELECT n
FROM (SELECT LEVEL n FROM DUAL WHERE LEVEL>1 CONNECT BY LEVEL<100)
WHERE NOT EXISTS (SELECT 1 FROM DUAL WHERE LEVEL>1 AND MOD(n,LEVEL)=0 CONNECT BY LEVEL<n )
)
,p2 AS (
SELECT * FROM (SELECT LPAD(n,2,'0') n FROM p UNION SELECT LPAD(n-1,2,'0') FROM p) WHERE SUBSTR(n,1,1)<>SUBSTR(n,2,1)
)
,t(num) AS (
SELECT CAST(n AS VARCHAR2(10)) FROM p2 WHERE n>'09'
UNION ALL
SELECT t.num||SUBSTR(p2.n,2)
FROM t,p2
WHERE SUBSTR(t.num,-1,1)=SUBSTR(p2.n,1,1) AND INSTR(t.num,SUBSTR(p2.n,2))=0
)
SELECT * FROM (SELECT * FROM t ORDER BY TO_NUMBER(num) DESC) WHERE ROWNUM=1
;
NUM
----------------------------
5978361042
Elapsed: 00:00:00.49
WITH p AS (
SELECT n
FROM (SELECT LEVEL n FROM DUAL WHERE LEVEL>1 CONNECT BY LEVEL<100)
WHERE NOT EXISTS (SELECT 1 FROM DUAL WHERE LEVEL>1 AND MOD(n,LEVEL)=0 CONNECT BY LEVEL<n )
)
,p2 AS (
SELECT LPAD(n,2,'0') n FROM p UNION SELECT LPAD(n-1,2,'0') FROM p
)
,s AS (SELECT REPLACE(SYS_CONNECT_BY_PATH(SUBSTR(n,1,1),','),',')||SUBSTR(n,2,1) str
FROM p2
START WITH n>'09'
CONNECT BY NOCYCLE SUBSTR(n,1,1)=PRIOR SUBSTR(n,2,1)
)
SELECT * FROM (
SELECT s.str
FROM s,(SELECT TO_CHAR(LEVEL-1) n FROM DUAL CONNECT BY LEVEL<=10)
WHERE INSTR(s.str,n)>0
GROUP BY s.str
HAVING COUNT(DISTINCT n)=LENGTH(s.str)
ORDER BY TO_NUMBER(s.str) DESC
)
WHERE ROWNUM=1;
STR
---------------
5978361042
Elapsed: 00:00:04.63
|
|