|
|
peter1166 发表于 2014-10-8 22:55 ![]()
第十题, SQL 的弄出来了, newkid 兄, 你的答案是对的。 证明如下;
方法一:
我看了一下你的MODEL, 和我的代码是一样的思路,也就是说无法证明。其中TMP是不必要的,可以去掉:
WITH T AS (SELECT LEVEL L , CHR(LEVEL+64) C FROM DUAL CONNECT BY LEVEL <= 5 )
,T1 AS (
SELECT ROW_NUMBER()OVER(ORDER BY T1.L,T2.L,T3.L,T4.L,T5.L)-1 N
,T1.C||T2.C||T3.C||T4.C||T5.C STR
,T2.C||T1.C||T3.C||T4.C||T5.C STR12
,T1.C||T3.C||T2.C||T4.C||T5.C STR23
,T1.C||T2.C||T4.C||T3.C||T5.C STR34
,T1.C||T2.C||T3.C||T5.C||T4.C STR45
FROM T T1, T T2 , T T3 , T T4 , T T5
)
,T2 AS (
SELECT * FROM T1
MODEL
DIMENSION BY (T1.N,T1.STR S)
MEASURES(T1.STR , T1.STR12 , T1.STR23 , T1.STR34 , T1.STR45 , CAST('' AS CHAR(5)) YN )
RULES ITERATE(3125) (
YN[ITERATION_NUMBER,S] = MAX(STR)[N<CV(),S IN (STR12[CV(),CV()],STR23[CV(),CV()],STR34[CV(),CV()],STR45[CV(),CV()])]
,STR[ITERATION_NUMBER,S] = CASE WHEN YN[CV(),CV()] IS NULL THEN STR[CV(),CV()] END
)
)
SELECT COUNT(STR) FROM T2
COUNT(STR)
----------
1625
Elapsed: 00:01:12.00
速度很慢, 因为你里面有嵌套循环。
改良一下,改用一系列标志位来表示占用与否:
WITH T AS (SELECT LEVEL L , CHR(LEVEL+64) C FROM DUAL CONNECT BY LEVEL <= 5 )
,T1 AS (
SELECT ROW_NUMBER()OVER(ORDER BY T1.L,T2.L,T3.L,T4.L,T5.L)-1 N
,T1.C||T2.C||T3.C||T4.C||T5.C STR
,T2.C||T1.C||T3.C||T4.C||T5.C STR12
,T1.C||T3.C||T2.C||T4.C||T5.C STR23
,T1.C||T2.C||T4.C||T3.C||T5.C STR34
,T1.C||T2.C||T3.C||T5.C||T4.C STR45
FROM T T1, T T2 , T T3 , T T4 , T T5
)
,t3 AS (
SELECT * FROM t1
MODEL
DIMENSION BY (str s)
MEASURES(n,str,str12,str23,str34,str45,0 n12,0 n23,0 n34,0 n45)
RULES (
n12[any]=n[str12[cv()]]
,n23[any]=n[str23[cv()]]
,n34[any]=n[str34[cv()]]
,n45[any]=n[str45[cv()]]
)
)
,t2 AS (
SELECT * FROM T3
MODEL
DIMENSION BY (N)
MEASURES(STR, N12 , N23 , N34 , N45 , 0 YN)
RULES ITERATE(3125) (
STR[ITERATION_NUMBER] = CASE WHEN YN[ITERATION_NUMBER]=0 THEN STR[CV()] END
,YN[N12[ITERATION_NUMBER]]=CASE WHEN STR[ITERATION_NUMBER] IS NULL THEN YN[N12[ITERATION_NUMBER]] ELSE 1 END
,YN[N23[ITERATION_NUMBER]]=CASE WHEN STR[ITERATION_NUMBER] IS NULL THEN YN[N23[ITERATION_NUMBER]] ELSE 1 END
,YN[N34[ITERATION_NUMBER]]=CASE WHEN STR[ITERATION_NUMBER] IS NULL THEN YN[N34[ITERATION_NUMBER]] ELSE 1 END
,YN[N45[ITERATION_NUMBER]]=CASE WHEN STR[ITERATION_NUMBER] IS NULL THEN YN[N45[ITERATION_NUMBER]] ELSE 1 END
)
)
SELECT COUNT(STR) FROM T2;
COUNT(STR)
----------
1625
Elapsed: 00:00:00.25 |
|