2011-09-02 30 views
2

我想獲取SQL中的行數。我用在Oracle中獲取指定的行數11g

select ROWNUM,FULL_NAME 
from OSQS_INSTITUTION 
order by FULL_NAME 
WHERE rownum BETWEEN 10 AND 20 

,並嘗試這個

select ROWNUM,FULL_NAME 
from OSQS_INSTITUTION 
order by FULL_NAME limit 10,20 

,並都返回相同的錯誤

SQL命令無法正常結束

編輯:

StringBuilder sqlStatement = new StringBuilder(); 
    sqlStatement.append("SELECT USER_NO,FULL_NAME,ACTIVE from"); 
    sqlStatement.append("("); 
    sqlStatement.append(" SELECT USER_NO,FULL_NAME,ACTIVE, ROW_NUMBER() OVER(ORDER BY full_name) rn"); 
    sqlStatement.append("FROM osqs_institution"); 
    sqlStatement.append(")WHERE rn BETWEEN ? AND ? "); 

    PreparedStatement pstmt = null; 
    pstmt = con.prepareStatement(sqlStatement.toString()); 
    pstmt.setInt(1, from); 
    pstmt.setInt(2, to); 
    rs = pstmt.executeQuery(); 

需要嘗試和捕獲。

+0

我知道是錯誤,在此行sqlStatement.append( 「FROM osqs_institution」); 我應該在「從」關鍵工作之前騰出空間 – palAlaa

回答

3

在查詢的第一個版本中,您指定ORDER BY之後的WHERE子句,該子句在語法上是錯誤的。

第二個版本適用於MySQL,但不適用於Oracle。

無論哪種情況,當您使用BETWEEN時都無法獲得任何行。

相反試試這個:

WITH qry AS 
(
    SELECT full_name, ROW_NUMBER() OVER(ORDER BY full_name) rn 
     FROM osqs_institution 
) 
SELECT rn, full_name 
    FROM qry 
WHERE rn BETWEEN 10 AND 20 

如果你不想使用ROW_NUMBER函數,那麼試試這個:

SELECT rn, full_name 
    FROM 
(
    SELECT full_name, ROWNUM AS rn 
     FROM (SELECT * FROM osqs_institution ORDER BY full_name) 
) 
WHERE rn BETWEEN 10 AND 20 
+0

它適用於thanx,但是「ROW_NUMBER()OVER(ORDER BY full_name)」是什麼意思? – palAlaa

+0

ROW_NUMBER是Oracle提供的一種分析功能。這意味着通過full_name對記錄進行排序,然後爲每個記錄分配一個行號。 – Chandu

+0

@Cyber​​nate - 在第二個查詢中,我假設你的意思是'ROWNUM'而不是'ROWNUMBER' –