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

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

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

    CONAN ZONE

    你越掙扎我就越興奮

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
    一個男人. 一個寫程序的男人. 一個寫程序并從程序中尋找快樂的男人. 一個寫程序并從程序中尋找快樂又把快樂傳遞給大家的男人. 一個書生. 一個寂寞的書生. 一個寂寞的梅香竹影下敲聲寫韻的書生. 一個寂寞的梅香竹影下敲聲寫韻晨鐘暮鼓中逸氣揚劍的書生. 那個男人是位書生。沒有人知道他的姓名,居無定所,行無定蹤,亦耕亦讀,或漁或樵。


    oracle 如何聚合多行函數

    在BEA論壇上看一位專家寫的大作,一條SQL語句是

    select	r.xm,
                substr(r.csrq,1,4)||'年'||substr(r.csrq,5,2)||'月'||substr(r.csrq,7,2)||'日' csrq,
                (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,
                (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,
                (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq,
                xz,
                xp,
                xz,
                fwcs
                from czrk_jbxx r,rk_zpxx p
                where r.gmsfhm=p.gmsfhm  and rownum<2

     (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,  (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,  (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq, 這里如何優化?

    也就是符合條件的多條記錄要合并成一條記錄的多個字段.

    其實之前有好多這樣的問題,但沒有一個好的方案,都是嵌套太多,性能損失很大,把三條記錄的結果合并.如果最后的sql語句中的select超過三次,那真的還不如直接這樣查詢.

    不過首先這個方法是錯誤的,因為這三次都在原表中查詢,性能損失很大,其實如果是5條,10條,20條,100條.這樣的語句寫起來就累死人了.

    之前有人提供了幾個方案,但都是連成字符串還不是形成多列.真正形成多列應該是用分析函數:

    這樣實際上只對原表做一次查詢,然后得到的結果集在顯示的時候被提前到一行上形成多列.

    select * from (
                select name,
                lead(name,1) over (order by name) as name1,
                lead(name,2) over (order by name) as name2,
                lead(name,3) over (order by name) as name3,
                lead(name,4) over (order by name) as name4
                from tb_customer where 條件
                ) t
                where t.name4 is not null

    這樣原來的行數越多節省的性能越高,因為實際原表查詢只有一次,后來只是對內存中的結果做合并.上面的那個例子就是

    select * from (
                select	dictvalue as mz,
                lead(dictvalue,1) over (order by dictcode) as ssxq,
                lead(dictvalue,2) over (order by dictcode) as xb,
                from zh_dictvalue
                where (dictcode=xb and dictname='rk_xb')
                or (dictcode=mz and dictname='rk_mz')
                or (dictcode=ssxq and dictname='rk_xzqh')
                ) t
                where t.ssxq not null
     
    不知道有沒有發現
    select	dictvalue as mz,
                lead(dictvalue,1) over (order by dictcode) as ssxq,
                lead(dictvalue,2) over (order by dictcode) as xb,
                后面as的順序?
    因為dictvalue值未知,如果按它排序,出來的值并不和mz,ssxq,xm有順序對應的關系,所以以dictcode排序,那么出來的值就是上面的對應關系.

    posted on 2008-07-12 19:16 CONAN 閱讀(1957) 評論(0)  編輯  收藏 所屬分類: Oracle
    主站蜘蛛池模板: 特级毛片全部免费播放| 亚洲国产综合精品中文第一| 国产亚洲精品91| 四虎影视免费在线| 亚洲国产日韩综合久久精品| 日本成年免费网站| 久久精品亚洲AV久久久无码| AV大片在线无码永久免费| 亚洲日韩国产精品无码av| 国产h肉在线视频免费观看| 亚洲精品美女久久久久9999| 久久国产免费福利永久| 亚洲最大福利视频| 国产无遮挡吃胸膜奶免费看视频 | 美女扒开尿口给男人爽免费视频 | 福利免费观看午夜体检区| 亚洲宅男天堂a在线| 在线看片韩国免费人成视频| 亚洲国产人成在线观看| 成年女人18级毛片毛片免费 | 一个人看的www视频免费在线观看| 国产亚洲自拍一区| 日韩电影免费在线观看中文字幕| 亚洲男人第一av网站| 亚洲视频免费在线看| 亚洲欧洲专线一区| 亚洲精品第一国产综合精品99| 在线免费观看h片| 亚洲第一成年网站大全亚洲| 免费观看的毛片手机视频| 一级一看免费完整版毛片| 亚洲av无码一区二区三区网站 | 无码专区AAAAAA免费视频| 中文字幕 亚洲 有码 在线| 免费国产成人高清视频网站| 国产又黄又爽胸又大免费视频| 久久99亚洲网美利坚合众国 | 成年人网站在线免费观看| 成人午夜免费视频| 亚洲国产精品综合久久2007| 麻豆国产精品入口免费观看|