布衣王子

          Email:roose2008@gmail.com QQ:79212131

          問題請教:SQL查詢語句怎樣限定返回結果集的行數

          例如:
          select * from tbale where vip = 1;
          這樣返回的結果集是表table中字段vip=1的所有紀錄。
          如果紀錄有1000行,我怎樣才能利用SQL語句在查詢的時候就只返回 100行到200行的紀錄呢?
          要怎樣的SQL語句才能實現?請教請教。
          有的人說用limit來限定,但是只有mysql才支持limit。我想找一中能長遠的方法能被大眾數據庫支持的方法。
          謝謝 (我主要考慮到在做分頁顯示的時候如果將記過集一次性查詢出來然后再來分頁打印的話太耗內存,
          如果能查詢幾行顯示幾行然后再查詢的話,這樣能夠緩解服務器的內存)

          posted on 2008-10-04 17:12 草包書生 閱讀(5135) 評論(13)  編輯  收藏

          評論

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 18:00 隔葉黃鶯

          沒有長遠的方法。  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 18:11 逝水fox

          這個是沒有辦法的了 SQLServer和MySQL在這個問題上使用不同的關鍵字
          參考Hibernate的處理
          在Loader類里面是
          if ( useLimit ) {
          sql = dialect.getLimitString( sql.trim(), useOffset ? getFirstRow(selection) : 0, getMaxOrLimit(selection, dialect) );
          }
          這里可以看到 限制返回行數的SQL他是交給具體的方言對象來處理的dialect
          而MySQLDialect
          public String getLimitString(String sql, boolean hasOffset) {
          return new StringBuffer( sql.length()+20 ).append(sql).append( hasOffset ? " limit ?, ?" : " limit ?").toString();
          }
          而SQLServerDialect則是使用的
          public String getLimitString(String querySelect, int offset, int limit) {
          if ( offset > 0 ) {
          throw new UnsupportedOperationException( "sql server has no offset" );
          }
          return new StringBuffer( querySelect.length()+8 ).append(querySelect).insert( getAfterSelectInsertPoint(querySelect), " top " + limit ).toString();
          }

          順便一說 OracleDialect是會拋出UnsupportedOperationException異常的

          你可以自己參考Hibernate的實現實現這個功能 但是 關鍵是 數據庫方言本身 是需要配置的 你自己程序雖然可以用方言的方式來猜測是哪種數據庫 但是 畢竟麻煩  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 18:13 R_XiaoGuang

          這段代碼也許對你有用
          源碼來自:http://www.aygfsteel.com/supercrsky/archive/2008/09/23/230723.html

          /**
          * 查詢用戶(帶分頁)
          *
          * @param startNo
          * 開始條數
          * @param maxCount
          * 最大記錄數
          * @return
          */
          public List<User> getAll(int startNo, int maxCount)
          {
          Connection conn = DBConnection.getConn();
          String sql = "select * from person";
          List<User> users = new ArrayList<User>();
          try
          {
          if (this.getAllSize() <= 0)
          return null;
          PreparedStatement pstmt = conn.prepareStatement(sql,
          ResultSet.TYPE_SCROLL_INSENSITIVE,
          ResultSet.CONCUR_READ_ONLY);
          // 最大查詢到第幾條記錄
          pstmt.setMaxRows(startNo + maxCount - 1);
          ResultSet rs = pstmt.executeQuery();
          // 將游標移動到第一條記錄
          rs.first();
          // 游標移動到要輸出的第一條記錄
          rs.relative(startNo - 2);
          while (rs.next())
          {
          User user = new User();
          user.setId(rs.getInt("id"));
          user.setUsername(rs.getString("username"));
          user.setAge(rs.getInt("age"));
          user.setRemark(rs.getString("remark"));
          users.add(user);
          }

          } catch (SQLException e)
          {
          e.printStackTrace();
          } finally
          {
          try
          {
          conn.close();
          } catch (SQLException e)
          {
          e.printStackTrace();
          }
          }
          return users;
          }  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 18:46 隔葉黃鶯

          建議放到新手區或提問區  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數[未登錄] 2008-10-04 19:06 草包書生

          @R_XiaoGuang
          謝謝,我要的就是這個!十分感謝!
          就是不知道prepareStatement內部封裝的SQL語句是什么樣的。
          感謝  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數[未登錄] 2008-10-04 19:06 草包書生

          @隔葉黃鶯
          知道了,馬上放  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數[未登錄] 2008-10-04 19:07 草包書生

          @逝水fox
          謝謝,十分感謝。我試著搞一下
          thank you  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 20:39 Ron.Liu

          強烈建議,不要用游標!!!

          可以用top關鍵字
          創建一個臨時表,用來需要返回的結果。
          先向表中插入top200,再刪除top100
          最后select中間表返回

          sql server  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 20:39 Ron.Liu

          嗯,我的方法要用存儲過程  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-04 20:42 Ron.Liu

          更好的方法:
          解1: select top 10 * from A where id not in (select top 30 id from A)
          解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)   回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數[未登錄] 2008-10-04 20:53 草包書生

          @Ron.Liu
          這種運算也行得通,不過mysql不支持top運算。
          不過還是感謝之極  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數[未登錄] 2008-10-04 20:55 草包書生

          @Ron.Liu
          你太聰明了  回復  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結果集的行數 2008-10-23 23:52 jiaqiang

          查詢第M行到第N行的問題,可以試試以下的查詢語句:
          select 列名,[列名]..
          from (select rownum rn, 列名,[列名]..
          from(select 列名,[列名]...
          from table_name
          order by id
          )
          where rownum <= N

          )
          where rn >= M;
            回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          常用鏈接

          相冊

          java的相關連接

          最新評論

          主站蜘蛛池模板: 亚东县| 巨鹿县| 临漳县| 盖州市| 江城| 都昌县| 清水河县| 勐海县| 吉木乃县| 方正县| 龙川县| 天柱县| 宝兴县| 垣曲县| 武邑县| 科技| 日照市| 磐安县| 清水河县| 长子县| 寿宁县| 顺平县| 青河县| 保山市| 建瓯市| 永康市| 霍城县| 石台县| 镇宁| 富源县| 襄垣县| 咸丰县| 张掖市| 临安市| 梧州市| 金川县| 临潭县| 柯坪县| 景泰县| 兴安盟| 抚顺市|