ITPUB论坛 » Oracle开发 » 练练手,一句SQL实现输出九九乘法表
新一届的微软MVP评选已经开始,欢迎各位推荐!
2007-4-25 20:38 nyfor
练练手,一句SQL实现输出九九乘法表

有兴趣的可以试试

2007-4-25 21:29 junsansi
哈哈,有点儿意思,俺来一个笨方法实现的~~~~

select r1 || '*' || r1 || '=' || r1 * r1 A,
       decode(r2, '', '', r2 || '*' || r1 || '=' || r2 * r1) b,
       decode(r3, '', '', r3 || '*' || r1 || '=' || r3 * r1) C,
       decode(r4, '', '', r4 || '*' || r1 || '=' || r4 * r1) D,
       decode(r5, '', '', r5 || '*' || r1 || '=' || r5 * r1) E,
       decode(r6, '', '', r6 || '*' || r1 || '=' || r6 * r1) F,
       decode(r7, '', '', r7 || '*' || r1 || '=' || r7 * r1) G,
       decode(r8, '', '', r8 || '*' || r1 || '=' || r8 * r1) H,
       decode(r9, '', '', r9 || '*' || r1 || '=' || r9 * r1) I
from   (select level r1,
               lag(level, 1) over(order by level) r2,
               lag(level, 2) over(order by level) r3,
               lag(level, 3) over(order by level) r4,
               lag(level, 4) over(order by level) r5,
               lag(level, 5) over(order by level) r6,
               lag(level, 6) over(order by level) r7,
               lag(level, 7) over(order by level) r8,
               lag(level, 8) over(order by level) r9
        from   dual
        connect by level < 10)

2007-4-26 07:59 eworm
呵呵,不错不错

2007-4-26 09:10 nyfor
不错! 虽然这样的SQL语句实现出来也没什么意义, 但可以训练你的SQL能力.
希望有更多的方法实现...

2007-4-26 09:47 iooyoo
想了很久
不知道这个怎么样:
[php]
select rn, ltrim(max(sys_connect_by_path(product, ',')), ',') product
from
(
  select rn, product, min(product) over(partition by rn) product_min
  ,(row_number() over(order by rn, product)) + (dense_rank() over(order by rn)) numId
  from
  (
    select b.rn, a.rn || '*' || b.rn || '=' || a.rn * b.rn product
    from (select rownum rn from all_objects where rownum <= 9) a,
    (select rownum rn from all_objects where rownum <= 9) b
    where a.rn <= b.rn
    order by b.rn, product
  )
)
start with product = product_min
connect by numId - 1 = prior numId
group by rn
order by rn

[/php]

2007-4-26 09:56 nyfor
嗯,也不错!
快接近最终结果了:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
.....

2007-4-26 10:05 junsansi
[QUOTE][i]最初由 iooyoo 发布[/i]
[B]想了很久
不知道这个怎么样:
[php]
select rn, ltrim(max(sys_connect_by_path(product, ',')), ',') product
from
(
  select rn, product, min(product) over(partition by rn) product_min
  ,(row_number() over(order by rn, product)) + (dense_rank() over(order by rn)) numId
  from
  (
    select b.rn, a.rn || '*' || b.rn || '=' || a.rn * b.rn product
    from (select rownum rn from all_objects where rownum <= 9) a,
    (select rownum rn from all_objects where rownum <= 9) b
    where a.rn <= b.rn
    order by b.rn, product
  )
)
start with product = product_min
connect by numId - 1 = prior numId
group by rn
order by rn

[/php] [/B][/QUOTE]

这个强,学习~~~

2007-4-26 10:06 iooyoo
[QUOTE][i]最初由 nyfor 发布[/i]
[B]嗯,也不错!
快接近最终结果了:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
..... [/B][/QUOTE]

最后有个order by rn
加了(1*1=),不知道怎么拆开 1*2=2, 2*2=4 成两列

2007-4-26 11:04 hit_lip01
都是强人!!

2007-4-26 11:21 nyfor
[QUOTE][i]最初由 iooyoo 发布[/i]
[B]

最后有个order by rn
加了(1*1=),不知道怎么拆开 1*2=2, 2*2=4 成两列 [/B][/QUOTE]

不用拆, 这样就行了, 不错不错! :rose: :rose: :rose:

2007-4-26 11:33 iooyoo
[QUOTE][i]最初由 nyfor 发布[/i]
[B]

不用拆, 这样就行了, 不错不错! :rose: :rose: :rose: [/B][/QUOTE]
还是从你的回帖中找到的思路啊,感谢,呵呵

2007-4-26 11:58 david_liao
向強人學習......

2007-4-26 12:57 nyfor
给出我写的一个SQL
[php]
select ltrim(sys_connect_by_path
              (rownum || '*' || lv || '=' || rpad(rownum * lv, 2),'  ')
            )
  from (select level lv from dual connect by level < 10)
where lv = 1
connect by lv + 1 = prior lv;

LTRIM(SYS_CONNECT_BY_PATH(ROWN
--------------------------------------------------------------------------------
1*1=1
2*2=4   2*1=2
3*3=9   3*2=6   3*1=3
4*4=16  4*3=12  4*2=8   4*1=4
5*5=25  5*4=20  5*3=15  5*2=10  5*1=5
6*6=36  6*5=30  6*4=24  6*3=18  6*2=12  6*1=6
7*7=49  7*6=42  7*5=35  7*4=28  7*3=21  7*2=14  7*1=7
8*8=64  8*7=56  8*6=48  8*5=40  8*4=32  8*3=24  8*2=16  8*1=8
9*9=81  9*8=72  9*7=63  9*6=54  9*5=45  9*4=36  9*3=27  9*2=18  9*1=9

9 rows selected
......
[/php]

2007-4-26 13:09 REBECCASOFT
我是为外资公司提供it人才服务的猎头公司
我公司网址:[url]www.millennium-soft.net[/url]
有意者请与我联系:msn:baiyu-xiong@hotmail.com

2007-4-26 13:19 iooyoo
[QUOTE][i]最初由 nyfor 发布[/i]
[B]给出我写的一个SQL
[php]
select ltrim(sys_connect_by_path
              (rownum || '*' || lv || '=' || rpad(rownum * lv, 2),'  ')
            )
  from (select level lv from dual connect by level < 10)
where lv = 1
connect by lv + 1 = prior lv;
[/php] [/B][/QUOTE]

:right: :right:    强!

2007-4-26 13:28 nyfor
突然想起, 九九乘法表 中排列不是这样,应该是:
[php]
LTRIM(REVERSE(SYS_CONNECT_BY_P
--------------------------------------------------------------------------------
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

9 rows selected
......
[/php]

有对我给出的SQL感兴趣的, 你可以修改一下,以实现上面的结果.

2007-4-26 13:31 test_100
沒話說了

2007-4-26 13:54 andytianyi
这个强,支持了~~~

2007-4-26 13:57 hyljqr
强赢

2007-4-26 14:23 iooyoo
没想出来……

页: [1] 2 3 4 5 6 7 8


Powered by ITPUB论坛