|
cszxheap 发表于 2015-9-22 18:44 ![]()
SELECT a.n a,b.n b,c.n c FROM d2 a,d4 b,d4 c WHERE a.n+b.n=c.n AND BITAND(a.bit,b.bit)=0 AND BITAN ...
计划不一样了,从HASH JOIN变成了NESTED LOOPS。但也不至于那么慢啊。百思不得其解。
改写成下面这样也很快:
WITH d AS (SELECT LEVEL-1 d,POWER(2,LEVEL-1) bit FROM DUAL CONNECT BY LEVEL<=10)
,num(len,n,bit) AS (
SELECT 1,d ,bit FROM d WHERE d<>0
UNION ALL
SELECT len+1,to_number(n||d),num.bit+d.bit FROM num,d WHERE BITAND(num.bit,d.bit)=0 AND len<4
)
,d2 AS (SELECT n,bit FROM num WHERE len=2)
,d3 AS (SELECT n,bit FROM num WHERE len=3)
,d4 AS (SELECT n,bit FROM num WHERE len=4)
SELECT a.n a,b.n b,c.n c FROM d3 a,d3 b,d4 c WHERE a.n<b.n AND a.n+b.n=c.n AND a.bit+b.bit+c.bit=power(2,10)-1
UNION ALL
SELECT a.n a,b.n b,c.n c FROM d2 a,d4 b,d4 c WHERE a.n+b.n=c.n AND a.bit+b.bit+c.bit=power(2,10)-1
ORDER BY c;
|
|