<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    打印九九乘法表
    ?
    ?
    ??? 網上找到的打印九九乘法表的SQL程序,關鍵的一些思路還是很有借鑒價值的。其實幾乎所有比較復雜的SQL基本上都會用到像lag、connect by、rownum、分析函數這些東西,逐漸看著看著,也就習慣了。下面分幾個類型介紹:
    ?
    一、枚舉法:
    ?
    select r1 || '*' || 1 || '=' || r1 * 1 A,
    ?????? decode(r2, '', '', r2 || '*' || 2 || '=' || r2 * 2) b,
    ?????? decode(r3, '', '', r3 || '*' || 3 || '=' || r3 * 3) C,
    ?????? decode(r4, '', '', r4 || '*' || 4 || '=' || r4 * 4) D,
    ?????? decode(r5, '', '', r5 || '*' || 5 || '=' || r5 * 5) E,
    ?????? decode(r6, '', '', r6 || '*' || 6 || '=' || r6 * 6) F,
    ?????? decode(r7, '', '', r7 || '*' || 7 || '=' || r7 * 7) G,
    ?????? decode(r8, '', '', r8 || '*' || 8 || '=' || r8 * 8) H,
    ?????? decode(r9, '', '', r9 || '*' || 9 || '=' || r9 * 9) I
    ? from (select level r1,
    ?????????????? lag(level + 1, 1) over(order by level) r2,
    ?????????????? lag(level + 2, 2) over(order by level) r3,
    ?????????????? lag(level + 3, 3) over(order by level) r4,
    ?????????????? lag(level + 4, 4) over(order by level) r5,
    ?????????????? lag(level + 5, 5) over(order by level) r6,
    ?????????????? lag(level + 6, 6) over(order by level) r7,
    ?????????????? lag(level + 7, 7) over(order by level) r8,
    ?????????????? lag(level + 8, 8) over(order by level) r9
    ????????? from dual
    ??????? connect by level < 10);
    ?
    1、先用connect by列出1-9的數列
    2、用lag函數排好次序
    3、最后打印出來。
    ?
    ?
    二、高級枚舉法:
    ?
    select max(decode(a, 1, cnt)) A,
    ?????? max(decode(a, 2, cnt)) B,
    ?????? max(decode(a, 3, cnt)) C,
    ?????? max(decode(a, 4, cnt)) D,
    ?????? max(decode(a, 5, cnt)) E,
    ?????? max(decode(a, 6, cnt)) F,
    ?????? max(decode(a, 7, cnt)) G,
    ?????? max(decode(a, 8, cnt)) H,
    ?????? max(decode(a, 9, cnt)) I
    ? from (select a.rn a, b.rn b, a.rn || '*' || b.rn || '=' || a.rn * b.rn cnt
    ????????? from (select rownum rn from dual connect by rownum <= 9) a,
    ?????????????? (select rownum rn from dual connect by rownum <= 9) b
    ???????? where a.rn <= b.rn)
    group by b
    order by 1;
    ?
    1、列出1-9的數列
    2、用笛卡爾積做出各個乘積
    3、排除多于的值,并排序輸出
    ?
    ?
    三、匯總結果法:
    ?
    select max(substr(sys_connect_by_path(b.n || '*' || a.n || '=' || a.n * b.n,', '),3)) as val
    ? from (select rownum n from all_objects where rownum <= 9) a,
    ?????? (select rownum n from all_objects where rownum <= 9) b
    where a.n >= b.n
    start with b.n = 1
    connect by a.n = prior a.n
    ?????? and b.n = prior b.n + 1
    group by a.n
    order by a.n;
    ?
    1、前面和枚舉法一樣列出1-9的數列,然后用笛卡爾乘積
    2、在打印時使用sys_connect_by_path函數,打印到一個字段中
    3、上面的程序中間步驟比較省略,下面這個程序比較詳細一些
    ?
    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;
    ?
    ?
    四、牛逼的簡化SQL:
    ?
    SELECT REPLACE(REVERSE(sys_connect_by_path(REVERSE(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;
    ?
    1、列出1-9序列
    2、使用本身的循環 lv + 1 = prior lv
    3、使用sys_connect_by_path函數打印
    4、具體的格式調整的方法還有很多,不列舉
    ?
    ?
    總結:
    ?
    1、要用一個字段打印一列是不太現實的,擴展性不大,要是99*99乘法表就不可能打印
    2、sys_connect_by_path還是一個比較實用的函數。
    ?
    posted on 2008-09-29 21:22 decode360 閱讀(1882) 評論(0)  編輯  收藏 所屬分類: 05.SQL
    主站蜘蛛池模板: 国产成人精品免费视| 亚洲国产精品一区二区久| 国产成人精品亚洲日本在线| 精品一区二区三区免费毛片| 三年片在线观看免费西瓜视频| 暖暖在线日本免费中文| 亚洲一区二区三区免费视频| 一级毛片免费毛片一级毛片免费| 狠狠亚洲狠狠欧洲2019| yellow免费网站| 免费夜色污私人影院在线观看| 亚洲AV无码一区二区乱子仑| 成人性生交大片免费看午夜a| 亚洲天堂电影在线观看| 久久久免费的精品| 亚洲人成色77777在线观看大| 亚洲熟妇色自偷自拍另类| 中文字幕在线免费看| 在线不卡免费视频| 亚洲欧洲日本精品| 日韩人妻无码精品久久免费一| 亚洲国产一区视频| eeuss影院ss奇兵免费com| 亚洲另类少妇17p| 最近免费中文字幕MV在线视频3| 国产亚洲av人片在线观看| 中文字幕免费在线看线人动作大片 | 亚洲国产精品久久久久秋霞影院| 四虎成人精品永久免费AV| 亚洲人成激情在线播放| 免费大片黄手机在线观看| 久久午夜夜伦鲁鲁片无码免费| 亚洲第一二三四区| 免费无码不卡视频在线观看| 三年片免费高清版 | 免费欧洲美女牲交视频| 成在线人免费无码高潮喷水| 亚洲午夜精品在线| 亚洲一区无码精品色| 免费精品国产自产拍在| 成人a毛片免费视频观看|