布衣王子

          Email:roose2008@gmail.com QQ:79212131

          問題請教:SQL查詢語句怎樣限定返回結(jié)果集的行數(shù)

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

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

          評論

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

          沒有長遠的方法。  回復(fù)  更多評論   

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

          這個是沒有辦法的了 SQLServer和MySQL在這個問題上使用不同的關(guān)鍵字
          參考Hibernate的處理
          在Loader類里面是
          if ( useLimit ) {
          sql = dialect.getLimitString( sql.trim(), useOffset ? getFirstRow(selection) : 0, getMaxOrLimit(selection, dialect) );
          }
          這里可以看到 限制返回行數(shù)的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的實現(xiàn)實現(xiàn)這個功能 但是 關(guān)鍵是 數(shù)據(jù)庫方言本身 是需要配置的 你自己程序雖然可以用方言的方式來猜測是哪種數(shù)據(jù)庫 但是 畢竟麻煩  回復(fù)  更多評論   

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

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

          /**
          * 查詢用戶(帶分頁)
          *
          * @param startNo
          * 開始條數(shù)
          * @param maxCount
          * 最大記錄數(shù)
          * @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();
          // 將游標(biāo)移動到第一條記錄
          rs.first();
          // 游標(biāo)移動到要輸出的第一條記錄
          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;
          }  回復(fù)  更多評論   

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

          建議放到新手區(qū)或提問區(qū)  回復(fù)  更多評論   

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

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

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

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

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

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

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

          強烈建議,不要用游標(biāo)!!!

          可以用top關(guān)鍵字
          創(chuàng)建一個臨時表,用來需要返回的結(jié)果。
          先向表中插入top200,再刪除top100
          最后select中間表返回

          sql server  回復(fù)  更多評論   

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

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

          # re: 問題請教:SQL查詢語句怎樣限定返回結(jié)果集的行數(shù) 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)   回復(fù)  更多評論   

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

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

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

          @Ron.Liu
          你太聰明了  回復(fù)  更多評論   

          # re: 問題請教:SQL查詢語句怎樣限定返回結(jié)果集的行數(shù) 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;
            回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          常用鏈接

          相冊

          java的相關(guān)連接

          最新評論

          主站蜘蛛池模板: 沂南县| 清水县| 周宁县| 西乌| 东阿县| 禹城市| 香格里拉县| 沙湾县| 鄂伦春自治旗| 嘉定区| 孟州市| 高邮市| 周至县| 龙口市| 昌江| 陆川县| 内丘县| 桂平市| 杭州市| 肃南| 上饶市| 久治县| 桐庐县| 淮滨县| 呼图壁县| 扎兰屯市| 连南| 维西| 常州市| 浦东新区| 兴国县| 唐河县| 新乡县| 信丰县| 寿宁县| 尚义县| 东辽县| 买车| 三都| 南宁市| 青岛市|