我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

如何为表中多条记录分别实现构造结果集(三)

上一篇 / 下一篇  2008-04-16 23:53:36 / 个人分类:ORACLE

前一段用SQL实现了一个复杂的功能,但是留下了一个问题一直没有真正的解决,那就是如何同时为表中的多条记录分别实现构造结果集。

利用MODEL语句来实现结果集构造。

问题源自:一个复杂问题的求解过程(一):http://yangtingkun.itpub.net/post/468/456641

如何为表中多条记录分别实现构造结果集(一):http://yangtingkun.itpub.net/post/468/459848

如何为表中多条记录分别实现构造结果集(二):http://yangtingkun.itpub.net/post/468/459938

 

 

上面一篇文章给出了利用自定义类型的SQL写法,那么完全使用SQL功能真的不能实现吗,这篇文章给出一个完全使用SQL实现的方法。

由于MODEL语句是10g新增语句,可能很多人对这个语句不熟,这里就不直接给出最终结果,而是分步解释一下。不过MODEL语法很复杂,功能很强大,这个SQL实现也基本上没有用到MODEL的主要功能,而是借用了MODEL语句中的一个小功能,因此这里不会对MODEL语句做多少解释,而主要解释这里用到的功能。

SQL> SELECT ID, VALUE, POWER, RESULT
"[)f W(AX i X0  2  FROM TITPUB个人空间%i] ^I1zGE
  3  MODEL
/oi-vKI.FC0  4   PARTITION BY (ID, VALUE, POWER)ITPUB个人空间6[3Ex R1XlAB:E
  5   DIMENSION BY (0 RESULT)
3oL?lM+@0  6   MEASURES (0 V)
h6s L$p/Xim'n0  7  RULESITPUB个人空间yI3n6m,d8HK#jg
  8   (
)mOc,X/H?${0  9    V[
xI}-sv~0 10     FOR RESULT INITPUB个人空间R JyQNt*{L?Y
 11     (
CX'c-x!ol0 12      SELECT ROWNUM FROM DUALITPUB个人空间n(V4D!\~W$c8e
 13      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)ITPUB个人空间N e X*HCM7p$AHG
 14     )
pg {#aD)_0 15    ] = 1ITPUB个人空间Z1S q#NE4N*wt0DI(T
 16   )ITPUB个人空间8a9}K#H wa^3V
 17  ORDER BY 1, 4;

        ID      VALUE      POWER     RESULTITPUB个人空间q7g'G;?6XhZ@3ps
---------- ---------- ---------- ----------
@$PQ1n ?d Y0         1          2          3          0ITPUB个人空间 tA"VLCGa;e/W/J
         1          2          3          1
)t f;L\ T|:]G$u-B0         1          2          3          2
${l'\NE*l!qK0         1          2          3          3
j \.vA/b$UlW4y0         1          2          3          4ITPUB个人空间Y#Q)G8p)ra pt
         2          1          2          0
d1BD4{l0         2          1          2          1
4p[!n(R/m;w'z?!Ea0         2          1          2          2ITPUB个人空间jZ6eiD:p$PZO+_
         2          1          2          3
/t4kOEdM;O0         2          1          2          4
C:m:ms\F5gq(il0         3          4          4          0
OH$U|A0         3          4          4          1ITPUB个人空间(X7Uo Ap#`{
         3          4          4          2ITPUB个人空间qqDb$k:\5jhj(UD
         3          4          4          3
9`s8~#`"{0         3          4          4          4ITPUB个人空间hdu_*Cn2Z5C0W~9J
         4          5          2          0
%X?Z yFh.eFQ0         4          5          2          1ITPUB个人空间s$eXX*w)Z
         4          5          2          2
3W)EV4?zW0         4          5          2          3
9Dw3U W W c0         4          5          2          4ITPUB个人空间A~ |W6d3U
         5          4          3          0
D!P,W k\.K5mx5|r0         5          4          3          1ITPUB个人空间9e+~w3xn1t
         5          4          3          2ITPUB个人空间;B;t-m r&k1S8S
         5          4          3          3ITPUB个人空间B"|YF!DkI
         5          4          3          4

已选择25行。

说是分步介绍,其实也只分了两步,上面这个SQL基本上实现了整个SQL的核心部分。

首先介绍一下语法,PARTITION BY语句列出数据的分区列,这个分区的概念和分析函数中的PARTITION BY语句类似。

DIMENSION BY语句指定维度列,通过这个列来控制和设置需要修改的列。

MEASURES BY语句指定定制新增的列。

这个例子中主要是利用DIMENSION BY语句的构造记录功能,对ID, VALUEPOWER都不需要进行任何的处理,因此将这3列放到PARTITION BY语句中。

由于需要DIMENSION BY来构造结果集,因此构造一个RESULT列。

MEASURES BY语句指定的列在本例子中没有用处,只是为了实现的语法需要,因此随意构造一个V列。

这里用到了FOR LOOP IN SUBQUERY的方式构造维度列的值,由于没有办法为每个ID分别生成构造结果集,因此这里只能表中最大的POWER来构造结果集,这对于大部分记录都会存在重复数据的问题,不过好在这里的重复记录和第一篇文章中的不同,这里重复记录是成线形增长的,因此不会对性能带来太大的负担。

有了上面这个结果集,要得到期望的最终结果就很容易了,只需要在这个的基础上过滤掉重复记录就可以了:

SQL> WITH T1ITPUB个人空间6n]3e NU[d'y Swo
  2  ASITPUB个人空间^?Ri2j
  3  (
Amd.K"]tW0  4  SELECT ID, VALUE, POWER, RESULT
3MAv1Mn1DTFS8OH0  5  FROM TITPUB个人空间#SZD8KQ
  6  MODELITPUB个人空间h ro)u(u
  7   PARTITION BY (ID, VALUE, POWER)
Qoc1p.iH8wp0  8   DIMENSION BY (0 RESULT)
2~hJ_{0  9   MEASURES (0 V)
XCJV:K c/QV,s"J0 10  RULES
:FDwa)Q k)`1m6F$x0 11   (
sN"@ j@[[HSM0 12    V[ITPUB个人空间I-ae1u/X:{%_G-O%J
 13     FOR RESULT INITPUB个人空间3k%HfG5tY2^7F8g
 14     (ITPUB个人空间 cC3@-Ayr/S
 15      SELECT ROWNUM FROM DUALITPUB个人空间NdW@G/uXd
 16      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)ITPUB个人空间y-U.}O YuEA{
 17     )
m;C$`_4XD0 18    ] = 1ITPUB个人空间-iX*V+`2|\5Y0Q
 19   )
H5{MiU*C/u0 20  )ITPUB个人空间 oJt:_^!Mn
 21  SELECT ID, VALUE, POWER, RESULT * VALUE RESULTITPUB个人空间9q_w(m m+~u
 22  FROM T1
2~ E0Va6tn4l0 23  WHERE RESULT < POWER
/Z&m/q8f,c0 24  ORDER BY 1, 4;

        ID      VALUE      POWER     RESULT
(OAv)G`4e0---------- ---------- ---------- ----------ITPUB个人空间t o)^)I9GFA
         1          2          3          0ITPUB个人空间?e.HWnb;J\/H'S
         1          2          3          2
1Y0Rc7Og$co0         1          2          3          4
SA0a W1O+A0         2          1          2          0
4Wdf%LJ0         2          1          2          1ITPUB个人空间S0z#l$pP(W
         3          4          4          0
6jvP:\CaT Q5{$~0         3          4          4          4
rW(Ov8dZOi;Y0         3          4          4          8ITPUB个人空间.t,k4wJ?.SC
         3          4          4         12ITPUB个人空间 _4@6F$kP[(QMAp
         4          5          2          0
,XSQ{B3|k0         4          5          2          5
%~-`*c/hv lC0         5          4          3          0
id`9p'z k.gC*K0         5          4          3          4ITPUB个人空间,](fv Xl9IX$W
         5          4          3          8

已选择14行。

下面看看这条语句的性能能否满足要求:

SQL> INSERT INTO T SELECT 5 + ID, VALUE, POWER FROM T;

已创建5行。

SQL> INSERT INTO T SELECT 10 + ID, VALUE, POWER FROM T;

已创建10行。

SQL> INSERT INTO T SELECT 20 + ID, VALUE, POWER FROM T;

已创建20行。

SQL> SET TIMING ONITPUB个人空间n#hrdn
SQL> SET AUTOT TRACE
F_qw2l!xo+S0SQL> WITH T1ITPUB个人空间2O!o:\*B6y`@4iD2]
  2  ASITPUB个人空间-K!t$n'nyvN
  3  (
v1j'Z\k5`0  4  SELECT ID, VALUE, POWER, RESULTITPUB个人空间|b([0I*jq'j
  5  FROM T
8mNL Wg"z1{`a0  6  MODELITPUB个人空间bsU+\7VR
  7   PARTITION BY (ID, VALUE, POWER)ITPUB个人空间4ti$T |!w~2Mm8b9x8I:c
  8   DIMENSION BY (0 RESULT)ITPUB个人空间 sb6fiNJx
  9   MEASURES (0 V)ITPUB个人空间{+v/u VU+y![R i(d
 10  RULESITPUB个人空间2DQ"i3GV,^
 11   (ITPUB个人空间}8^.Cw0~~@
 12    V[
;T p:y-\7UaV(VOT3g0 13     FOR RESULT INITPUB个人空间&YXxP h
 14     (
Lg'z6}6} t0 15      SELECT ROWNUM FROM DUALITPUB个人空间%rWCM,M%Qx
 16      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)
?*Lh-I;a0T0E0 17     )ITPUB个人空间d0r(G2} UM0c+g }6O
 18    ] = 1
D])VWu |2T N2g0k0 19   )
"HX;f9C1ot$rK0 20  )ITPUB个人空间-q-T)w|a
 21  SELECT ID, VALUE, POWER, RESULT * VALUE RESULT
Y%yP3\k0 22  FROM T1ITPUB个人空间-o` WbRt
 23  WHERE RESULT < POWER
Q5v:ap KQy0 24  ORDER BY 1, 4;

已选择112行。

已用时间:  00: 00: 00.01

执行计划ITPUB个人空间(u"ikwy;B
----------------------------------------------------------
#o5t8n+s1}Vg0Plan hash value: 3959148217

------------------------------------------------------------------------------------------ITPUB个人空间 R Z+e2j.~%O
| Id  | Operation                         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
[&pKo jW0------------------------------------------------------------------------------------------
s$a:v2BP0|   0 | SELECT STATEMENT                  |      |     5 |   260 |     4  (25)| 00:00:01 |
n'^g?nx |0|   1 |  SORT ORDER BY                    |      |     5 |   260 |     4  (25)| 00:00:01 |ITPUB个人空间I9oX A[ H,Q5yn-f
|*  2 |   VIEW                            |      |     5 |   260 |     3   (0)| 00:00:01 |
4E`iJanx3Y h+x)j0|   3 |    SQL MODEL ORDERED              |      |     5 |    45 |            |          |
*v }vs-y8g0|   4 |     TABLE ACCESS FULL             | T    |     5 |    45 |     3   (0)| 00:00:01 |ITPUB个人空间8_7AL3{2F
|   5 |     BUFFER SORT                   |      |     1 |       |            |          |ITPUB个人空间 `g JmU
|   6 |      COUNT                        |      |       |       |            |          |ITPUB个人空间n|KHYD-C R g
|   7 |       CONNECT BY WITHOUT FILTERING|      |       |       |            |          |
o5J,_Kf!U+IHX&x e0|   8 |        FAST DUAL                  |      |     1 |       |     2   (0)| 00:00:01 |
l1[b2hT(M"EB/w0------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
?"ik3cv0l)B0---------------------------------------------------

   2 - filter("RESULT"<"POWER")

ITPUB个人空间S'O2?] @1}t
统计信息ITPUB个人空间:xqa7i)V$Ze{%m
----------------------------------------------------------
rSR W2pEU(K O x E0          0  recursive calls
} c:r ]6uwg1Y P)U0          0  db block gets
Np?#k!z9?@]xH0         14  consistent gets
"` pz6i3M"H`d;p%s c3v0          0  physical readsITPUB个人空间2R[5Pxs/fEw
          0  redo size
LM!e^+EC+V A%jS0       2675  bytes sent via SQL*Net to client
-} o5n+yQ7Jtr4x+{0        462  bytes received via SQL*Net from client
p"j3c|#G;b#^;l9y0          9  SQL*Net roundtrips to/from clientITPUB个人空间,sB:^.d,cT
          3  sorts (memory)ITPUB个人空间^Ve5n3\{f
          0  sorts (disk)ITPUB个人空间FK;@;t,K
        112  rows processed

将数据量增大一倍:

SQL> SET AUTOT OFFITPUB个人空间3n3Tz0V\;M,N f3W]
SQL> SET TIMING OFFITPUB个人空间9P-x|)b,kG3ru
SQL> INSERT INTO T SELECT 40 + ID, VALUE, POWER FROM T;

已创建40行。

SQL> SET TIMING ONITPUB个人空间PNk$mz$A3T$Fj
SQL> SET AUTOT TRACEITPUB个人空间|!S#[_gM
SQL> WITH T1
:@X`)r ^wh0  2  ASITPUB个人空间3]%d:[ h\
  3  (ITPUB个人空间m'?1LCh Y`;wMF
  4  SELECT ID, VALUE, POWER, RESULT
G$]3~ w&_y5F0  5  FROM TITPUB个人空间9ghtQz;wG
  6  MODELITPUB个人空间]}O!u!}oh e
  7   PARTITION BY (ID, VALUE, POWER)
NZ'iN6N6eX0  8   DIMENSION BY (0 RESULT)ITPUB个人空间I+P?$I%e0a,j}~s
  9   MEASURES (0 V)
m?~E4N\0 10  RULESITPUB个人空间+s.v"q3J2z{;g*wZw{
 11   (
E@z0qk X1flE&s0 12    V[ITPUB个人空间lk\oC'w&{a
 13     FOR RESULT INITPUB个人空间d0zO;it%L3FF0{
 14     (ITPUB个人空间4o'Yn] W!L [
 15      SELECT ROWNUM FROM DUALITPUB个人空间p&K;g3An%u
 16      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)ITPUB个人空间)PT$C5Z ph-r n)MS
 17     )ITPUB个人空间(e$k+L!w^i1c^H
 18    ] = 1ITPUB个人空间JK9@#qj,?3M\ Ij
 19   )
3O(?UF3\ F,l&SGt!Y0 20  )
6hW[3U$q[?4}$m0 21  SELECT ID, VALUE, POWER, RESULT * VALUE RESULT
:S u5QB5`7Sbw@0 22  FROM T1
s,ZytoT C0 23  WHERE RESULT < POWERITPUB个人空间&a LNd f'p} x yv
 24  ORDER BY 1, 4;

已选择224行。

已用时间:  00: 00: 00.01

执行计划ITPUB个人空间&S4k'Oo0L-qY p _
----------------------------------------------------------
C|o+A](c#U0Plan hash value: 3959148217

------------------------------------------------------------------------------------------
"b|5kBT_sf0C:U0| Id  | Operation                         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
3Cd8Xi(K bJT v#g/E l0------------------------------------------------------------------------------------------
Y:r~ slE$BVPr}0|   0 | SELECT STATEMENT                  |      |     5 |   260 |     4  (25)| 00:00:01 |ITPUB个人空间3jS;P$h w6L
|   1 |  SORT ORDER BY                    |      |     5 |   260 |     4  (25)| 00:00:01 |ITPUB个人空间 J9U5z2r$sL%M%N
|*  2 |   VIEW                            |      |     5 |   260 |     3   (0)| 00:00:01 |
!x^&~tZ$w0|   3 |    SQL MODEL ORDERED              |      |     5 |    45 |            |          |
u:xS ~%QG {w%L0|   4 |     TABLE ACCESS FULL             | T    |     5 |    45 |     3   (0)| 00:00:01 |
2j$DRP d"NT_0|   5 |     BUFFER SORT                   |      |     1 |       |            |          |ITPUB个人空间0|:B8U7E5T/^
|   6 |      COUNT                        |      |       |       |            |          |ITPUB个人空间_ k cU6zYi
|   7 |       CONNECT BY WITHOUT FILTERING|      |       |       |            |          |ITPUB个人空间wm(i_%GR^;r/L a
|   8 |        FAST DUAL                  |      |     1 |       |     2   (0)| 00:00:01 |
(ja\.F T[ ~"{ T0S0------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
[u? S6P5xF+XF0Z0---------------------------------------------------

   2 - filter("RESULT"<"POWER")

ITPUB个人空间%U"SzA Cv
统计信息
_8K"M e o0----------------------------------------------------------
0cS?f,j+W0          0  recursive calls
O(jC ~8Zk0          0  db block gets
yIJki/We0         14  consistent gets
}]FA B`yO0          0  physical reads
4vmXZ-yS0          0  redo size
r{1s.CB~.R0       4756  bytes sent via SQL*Net to clientITPUB个人空间v@ gc%L)r Hc
        539  bytes received via SQL*Net from client
Jde&_(F ~,D v,Z6l0         16  SQL*Net roundtrips to/from clientITPUB个人空间h-]\-k/cnOXO
          3  sorts (memory)
^%N\8Ed4j bo0          0  sorts (disk)ITPUB个人空间:i J;VZ!UdVrqp4T
        224  rows processed

从执行时间上看,也没有任何变化,下面将数据量增加到1000

SQL> SET AUTOT OFF
3G Ye` pi0SQL> SET TIMING OFF
^R,~I _)u)N p%c0SQL> INSERT INTO T SELECT 80 + ID, VALUE, POWER FROM T;

已创建80行。

SQL> INSERT INTO T SELECT 160 + ID, VALUE, POWER FROM T;

已创建160行。

SQL> INSERT INTO T SELECT 320 + ID, VALUE, POWER FROM T;

已创建320行。

SQL> INSERT INTO T SELECT 640 + ID, VALUE, POWER FROM T;

已创建640行。

SQL> SET TIMING ON
g3e/EN wC0SQL> SET AUTOT TRACEITPUB个人空间;j P4o+oXo3Vf
SQL> WITH T1ITPUB个人空间 C\/Z7_7}3qD
  2  ASITPUB个人空间6^9Ai"ZB$B|-B
  3  (ITPUB个人空间2ee3wX;~ m!SvA&y{
  4  SELECT ID, VALUE, POWER, RESULTITPUB个人空间'jg P5v A0_"[8D5p
  5  FROM TITPUB个人空间&LY0aTQu6U sQ
  6  MODELITPUB个人空间*Y e6B!^,?*Ue
  7   PARTITION BY (ID, VALUE, POWER)
dyRXcDR.t0  8   DIMENSION BY (0 RESULT)
5qJl0Qb5P ^8p0  9   MEASURES (0 V)
ROY*Fk&qcI1Wd,\7r0 10  RULESITPUB个人空间? wx[;Do
 11   (
wr$Z"N2v0 12    V[ITPUB个人空间,KPht#{:J$j!e _
 13     FOR RESULT IN
vXr4|D)G$j}!P0 14     (ITPUB个人空间(Os3d2^8R8UKI
 15      SELECT ROWNUM FROM DUAL
6]pe'P~ C!T0 16      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)
:b8b'D t*Q#r0 17     )ITPUB个人空间-gnvJ1uu
 18    ] = 1ITPUB个人空间[r\ S+z3H(P R
 19   )ITPUB个人空间&O:W S$rU.l Gm[
 20  )ITPUB个人空间 u7~v(]?w j
 21  SELECT ID, VALUE, POWER, RESULT * VALUE RESULTITPUB个人空间XO(mS;k!^] [
 22  FROM T1
^8Hh_VV!a Y8G\0 23  WHERE RESULT < POWERITPUB个人空间J0JVq f O
 24  ORDER BY 1, 4;

已选择3584行。

已用时间:  00: 00: 00.09

执行计划
^"c&o\BPm"O6ld0----------------------------------------------------------ITPUB个人空间,{r_;i'YDSo"d4DEi
Plan hash value: 3959148217

------------------------------------------------------------------------------------------ITPUB个人空间%?,x Hus
| Id  | Operation                         | Name | Rows  | Bytes | Cost (%CPU)| Time     |ITPUB个人空间i!yDQ3~E)K&O;H:P? M
------------------------------------------------------------------------------------------
;r1i#sW ]A bkc0|   0 | SELECT STATEMENT                  |      |     5 |   260 |     4  (25)| 00:00:01 |ITPUB个人空间Wr4w:A0C
|   1 |  SORT ORDER BY                    |      |     5 |   260 |     4  (25)| 00:00:01 |ITPUB个人空间3|oEP;[-~/W5i ^
|*  2 |   VIEW                            |      |     5 |   260 |     3   (0)| 00:00:01 |
)e.w;K(y mPE }Pt0|   3 |    SQL MODEL ORDERED              |      |     5 |    45 |            |          |
w:{3B)N!y f]0|   4 |     TABLE ACCESS FULL             | T    |     5 |    45 |     3   (0)| 00:00:01 |
d4ey;Y [5^z0|   5 |     BUFFER SORT                   |      |     1 |       |            |          |
2E*a!wC4N6h6z J$K6z0|   6 |      COUNT                        |      |       |       |            |          |ITPUB个人空间jNn9S.F,O:N
|   7 |       CONNECT BY WITHOUT FILTERING|      |       |       |            |          |ITPUB个人空间 p\7_(g{|-q
|   8 |        FAST DUAL                  |      |     1 |       |     2   (0)| 00:00:01 |ITPUB个人空间;l!L6b^"K _f.`
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):ITPUB个人空间r,R X1nB[Ih M
---------------------------------------------------

   2 - filter("RESULT"<"POWER")

ITPUB个人空间L&A0^3w/M
统计信息
"L^m0Y^ k1P0----------------------------------------------------------ITPUB个人空间eES ti6@L
          0  recursive callsITPUB个人空间&fOUa~-`KU
          0  db block gets
(s{l7@ok0         14  consistent getsITPUB个人空间7FXHE-s
          0  physical reads
COI ]j3Bsz7z0          0  redo sizeITPUB个人空间j)LQd&Ydg7Pq
      70133  bytes sent via SQL*Net to client
e3h^%B3zP*H.R_*p0       3003  bytes received via SQL*Net from clientITPUB个人空间x w ^-^y Z8@7o
        240  SQL*Net roundtrips to/from client
t t*{8Wb'I)g0          3  sorts (memory)
yA~4hAC$q1o o0          0  sorts (disk)
i:G8t.s&]O0       3584  rows processed

即使表中数据量达到了1000,这个SQL的性能也完全可以满足要求。

虽然对比三种方法,似乎这种方式速度最快,但是这种方法会产生不定数量的重复记录,在上面的这个例子中,所有记录的POWER值比较接近,因此重复记录不是很多,一旦表中个别记录所需构造结果远远大于平均水平,就可能产生大量的重复记录,从而影响这个SQL的性能。

举个简单的例子:

SQL> UPDATE T SET POWER = 1000 WHERE ID = 1;

已更新1行。

已用时间:  00: 00: 00.03

SQL> WITH T1
8\+r\u|)jFX0  2  AS
\ HJP2v"[y@]N0  3  (
~Z1v#b'V&?S3P0  4  SELECT ID, VALUE, POWER, RESULTITPUB个人空间1@*UIkz^G E
  5  FROM TITPUB个人空间8_,G@2`Z{E
  6  MODEL
VC A ~$B$b)K/}n0  7   PARTITION BY (ID, VALUE, POWER)ITPUB个人空间W4z9E [D.jIc
  8   DIMENSION BY (0 RESULT)
^"Mic/]2vc2?U+X|0  9   MEASURES (0 V)
ZIc K4K6@_2U h0 10  RULESITPUB个人空间UcC Hy6I"Xw
 11   (
'C1USFVR0 12    V[ITPUB个人空间0x!}N lQS6c]
 13     FOR RESULT INITPUB个人空间P}*SVK;G
 14     (ITPUB个人空间3Z7\n#\ e;Y
 15      SELECT ROWNUM FROM DUAL
*]@ q4Y&T*vk,Z0 16      CONNECT BY LEVEL <= (SELECT MAX(POWER) FROM T)
4ZVqqxR8M0 17     )ITPUB个人空间b|mb ?Q G&~
 18    ] = 1
:`2[0['`B0 19   )
Z-sU3j6_3^n\:A0 20  )ITPUB个人空间 \,Vumq@#`|
 21  SELECT ID, VALUE, POWER, RESULT * VALUE RESULT
'}:{C/H Z3dvb0 22  FROM T1ITPUB个人空间L)M,P@q
 23  WHERE RESULT < POWER
Y+qUWlSw.S0 24  ORDER BY 1, 4;

已选择4581行。

已用时间:  00: 00: 44.26

统计信息ITPUB个人空间*s3c;]0C)kh;a1t
----------------------------------------------------------
-N1LlW Nfh%| h0          0  recursive callsITPUB个人空间 H,_f"vy$yLR)D-[5a
          0  db block gets
k,gK(t A%AdY/h"F0         14  consistent gets
A$KDD^.h0kp UwG{x0          0  physical readsITPUB个人空间 k QUDj9]3r
          0  redo sizeITPUB个人空间(^:K]7M-G&b
      87549  bytes sent via SQL*Net to client
,~6R*oD }j0       3740  bytes received via SQL*Net from client
`pxO2K&\0        307  SQL*Net roundtrips to/from client
7_EPH y K7m0          3  sorts (memory)
V uGP ? k#^y0          0  sorts (disk)
I?fhU7Ju5a d N0       4581  rows processed

而不产生重复记录的第二种方法则不存在这个问题:

SQL> WITH T1 ASITPUB个人空间l2r:v'@|
  2  (
%U#u%|Uj&n/d0  3  SELECT ID, VALUE, POWER,ITPUB个人空间\2x `V$v
  4   CAST (MULTISET(ITPUB个人空间uaj#FV3U
  5    SELECT VALUE * (LEVEL - 1)
\7UR x Jd:L:|0  6    FROM DUAL CONNECT BY ROWNUM <= POWER
nR}v ZS0  7   ) AS T_TYPE) RESULTITPUB个人空间/dk'] ] ~2C"C7f!`
  8  FROM TITPUB个人空间8{&f cC%T%X
  9  )
n],f2a-o0 10  SELECT ID, VALUE, POWER, T.COLUMN_VALUE RESULTITPUB个人空间1iD0\@b`l!q
 11  FROM T1 A, TABLE(SELECT RESULT FROM T1 WHERE T1.ID = A.ID) T
:_|8\a)dkK0 12  ;

已选择4581行。

已用时间:  00: 00: 00.34

统计信息ITPUB个人空间;M v Z MO` u m$? X
----------------------------------------------------------
4CdL5It.}1tD0          0  recursive callsITPUB个人空间n2|5BA${"w5U`
          0  db block gets
9gHW+\R0      16703  consistent getsITPUB个人空间3AZ~a T%e
          0  physical readsITPUB个人空间 Fn:_0}@
          0  redo size
lg[:Y5TO{2Q0      87540  bytes sent via SQL*Net to clientITPUB个人空间4m[,y2o%]#n4G6n N)@
       3740  bytes received via SQL*Net from clientITPUB个人空间Mrlo*d9C XX
        307  SQL*Net roundtrips to/from clientITPUB个人空间?.g$uj&{`Y3c
       1280  sorts (memory)
"@4d8Wc{fL0          0  sorts (disk)ITPUB个人空间'C `q g'?i7T?
       4581  rows processed

因此选择何种方法需要根据具体情况进行判断,第三种方式值得一提的是这个方式是完全利用SQL功能来实现的。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar