|
WITH T AS (SELECT LEVEL N FROM DUAL CONNECT BY LEVEL < 10)
,T1 AS (
SELECT A,C,B ,LEVEL L
FROM (
SELECT T1.N A, T2.N B
,CASE WHEN FLOOR(SQRT(T1.N * T2.N)) = SQRT(T1.N * T2.N) THEN SQRT(T1.N * T2.N) -1 ELSE FLOOR(SQRT(T1.N * T2.N)) END C
FROM T T1, T T2
WHERE T1.N < T2.N
)
CONNECT BY PRIOR A = A AND PRIOR B = B AND LEVEL <= C AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
)
SELECT MAX(N)
FROM (
SELECT A,L,B,S , SYS_CONNECT_BY_PATH(S,'|') , TO_NUMBER(SUBSTR(CONNECT_BY_ROOT(S),1,2)||REPLACE(SYS_CONNECT_BY_PATH(SUBSTR(S,3),'|'),'|')) N
FROM (
SELECT T1.A , T1.L , T1.B, T1.A||T1.L||T1.B S FROM T1
UNION ALL
SELECT T1.B, T1.L , T1.A, T1.B||T1.L||T1.A S FROM T1
)
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR SUBSTR(S,2) = SUBSTR(S,1,2)
)
/
MAX(N)
----------
95322359
-- 验证用 SQL 。
WITH T AS (SELECT '95322359' N FROM DUAL)
SELECT T1.*
,CASE WHEN T1.C1< SQRT(T1.C2 * T1.C3) THEN 'Y' ELSE 'N' END CHK_YN
FROM (
SELECT N ,LEVEL L
,SUBSTR(N,LEVEL,1) C1
,SUBSTR(N,LEVEL+1,1) C2
,SUBSTR(N,LEVEL-1,1) C3
FROM T
CONNECT BY LEVEL <= (SELECT LENGTH(N) FROM T)
) T1
/
N L C1 C2 C3 CHK_YN
-------- ---------- ---- ---- ---- ------
95322359 1 9 5 9 N
95322359 2 5 3 9 Y
95322359 3 3 2 5 Y
95322359 4 2 2 3 Y
95322359 5 2 3 2 Y
95322359 6 3 5 2 Y
95322359 7 5 9 3 Y
95322359 8 9 5 N
|
|