|
|
sort merge join:
http://asktom.oracle.com/pls/ask ... ON_ID:3109440977616
你的连接条件仅有a.n<b.n,所以和他描述的不太一样。
我稍微改写了一下,奇怪的是答案比你多了很多:
WITH n AS (
SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=15
)
,t (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,lvl,roundup) AS (
SELECT n,0,0,0,0,0,0,0,0,0,0,0,1,0
FROM n
WHERE n<8
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 )
,DECODE(t.lvl,9 ,n.n,t.n10)
,DECODE(t.lvl,10,n.n,t.n11)
,DECODE(t.lvl,11,n.n,t.n12)
,t.lvl+1
,CASE t.lvl
WHEN 5 THEN FLOOR((t.n4 +t.n5 )/16)
WHEN 8 THEN FLOOR((t.n7 +t.n8 +t.roundup)/16)
WHEN 11 THEN FLOOR((t.n10+t.n11+t.roundup)/16)
ELSE t.roundup
END
FROM t,n
WHERE n.n NOT IN (n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11)
AND (t.lvl IN (3,6,9)
OR (t.lvl=11 AND n.n = MOD(t.n10+t.n11+t.roundup,16) AND t.n3=t.n1+t.n2+FLOOR((t.n10+t.n11)/16))
OR (t.lvl=10 AND n.n>t.n10)
OR (t.lvl=8 AND n.n = MOD(t.n7+t.n8+t.roundup,16))
OR (t.lvl=7 AND n.n>t.n7)
OR (t.lvl=5 AND n.n = MOD(t.n4+ t.n5,16))
OR (t.lvl=4 AND n.n>t.n4)
OR (t.lvl=2 AND n.n - t.n1- t.n2 IN (0,1))
OR (t.lvl=1 AND n.n>t.n1 AND n.n+t.n1<=15)
)
)
SELECT TO_CHAR(n1,'X') ||TO_CHAR(n10,'X')||TO_CHAR(n7,'X')||TO_CHAR(n4,'X')
||' + '
||TO_CHAR(n2,'X')||TO_CHAR(n11,'X')||TO_CHAR(n8,'X')||TO_CHAR(n5,'X')
||' = '
||TO_CHAR(n3,'X')||TO_CHAR(n12,'X')||TO_CHAR(n9,'X')||TO_CHAR(n6,'X') ------ 位数对调的其他组合略
FROM t
WHERE lvl=12
;
位置的排列组合还可以更彻底,个、十、百还可以对调。 |
|