明明是自己有BUG还怀疑ORACLE有BUG, 惭愧惭愧!
WITH n AS (
SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=9
)
,t (n1,n2,n3,n4,n5,n6,n7,n8,n9,lvl) AS (
SELECT n,0,0,0,0,0,0,0,0,1
FROM n
WHERE n<=4
UNION ALL
SELECT t.n1
,DECODE(t.lvl,1,n.n,t.n2)
,DECODE(t.lvl,2,n.n,t.n3)
,DECODE(t.lvl,3,n.n,t.n4)
,DECODE(t.lvl,4,n.n,t.n5)
,DECODE(t.lvl,5,n.n,t.n6)
,DECODE(t.lvl,6,n.n,t.n7)
,DECODE(t.lvl,7,n.n,t.n8)
,DECODE(t.lvl,8,n.n,t.n9)
,t.lvl+1
FROM t,n
WHERE n.n NOT IN (n1,n2,n3,n4,n5,n6,n7,n8,n9)
AND (t.lvl=1 AND n.n>t.n1 AND n.n+t.n1<=9
OR (t.lvl=2 AND n.n - t.n1- t.n2 IN (0,1))
OR (t.lvl=5 AND n.n = MOD(t.n4+ t.n5,10))
OR t.lvl IN (3,4,6,7,8)
)
)
SELECT n1||n7||n4||' + '||n2||n8||n5||' = '||n3||n9||n6
FROM t
WHERE lvl=9
AND n1*100+n7*10+n4 + n2*100+n8*10+n5 = n3*100+n9*10+n6
;
性能:
Elapsed: 00:00:00.20
哈哈。 |