这样改就行:
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 <9 -- AND t.lvl NOT IN (1,2,5)
)
)
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
AND n1<n2 ---- 最后进行过滤
;
这样就不行:
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 <9 AND t.lvl NOT IN (1,2,5) --------- 遍历过程中过滤
)
)
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
; |