2012-03-09 51 views
3

我該如何在Oracle的表中選擇第一個x行,然後是下一個x等等?我知道我可以使用TOP/LIMIT,然後我得到第一個150行。選擇前150行,然後是下150等等?

編輯:爲什麼?我想第一個150級的輸出複製到一個文件,然後在接下來的150到另一個文件等等...

+0

問題是:爲什麼? – vulkanino 2012-03-09 09:15:17

+0

我想將第一個150個輸出複製到一個文件中,然後將下一個150複製到另一個文件中,等等...... – sabisabi 2012-03-09 10:48:22

+0

帶有代碼?或直接從甲骨文?來自oracle的 – vulkanino 2012-03-09 10:49:37

回答

8

在Oracle中,你有很好的rownum:它是一個僞列。它將結果集中的記錄編號。滿足select語句中的where標準的第一條記錄被給出rownum=1,並且每個後續記錄滿足相同條件的記錄增加rownum

SELECT 
    a, b 
FROM 
    (SELECT rownum rn, a, b from table WHERE c=some_value ORDER BY some_column) 
WHERE 
    rn BETWEEN 150 AND 300; 

(感謝@馬克·班尼斯特)

如果嵌入的ORDER BY子句中的子查詢並把ROWNUM條件在頂級查詢,則可以強制ROWNUM條件要應用在排序之後。

+0

hm不知道爲什麼你輸入150和300之間的結束。爲什麼150/300? – sabisabi 2012-03-09 09:26:41

+0

這是一個例子,你可以把你想要的數字。 – vulkanino 2012-03-09 09:34:27

+0

這就是問題^^,我認爲這個解決方案不會爲我工作。假設我想有第一個150,然後是下一個150等......而我的桌子有100000行。我之間輸入什麼? :/ – sabisabi 2012-03-09 09:36:45

7

LIMIT 150LIMIT 0,150:第一行150

LIMIT 150,150:下一個150行

LIMIT 300,150:下一個150行

+0

所以如果我有100000行,我必須鍵入很多東西^^ ...? – sabisabi 2012-03-09 09:10:29

+0

設置變量'a = 1'。 'LIMIT(a-1)* 150,150'。增加a。 (這是僞SQL) – xbonez 2012-03-09 09:11:47

2

我假設你正在試圖做的分頁,如果這樣你就可以做這樣的:

pageSize150

SELECT * FROM 
(
    SELECT a.*, rownum r__ 
    FROM 
    (
     SELECT * FROM tblName c 
    ) a 
    WHERE rownum < ((pageNumber * pageSize) + 1) 
) 
WHERE r__ >= (((pageNumber-1) * pageSize) + 1) 
+0

pageNumber是表中所有行的值在一起的權利? – sabisabi 2012-03-09 09:34:38

+0

@ user1258905 - 編號頁碼是實際的頁碼。即頁面1,頁面2等。頁面=前150條記錄,第2頁=後150條記錄等。 – Flukey 2012-03-09 09:50:01

0
  1. 首先獲得最後一個元素的ID從頂部選擇行:

(a)SQL查詢如下:

Select top 1 id from (SELECT TOP 150 * FROM (select top 150 * from outlet order by id asc)as d order by id desc) as b order by id asc 
  1. 保存選擇的ID在ViewState中的一個會話對象即LastOutletID

  2. 聲明一個INT每頁= 150,並且還添加到視圖狀態的會話對象

(b)SqlQuery as Follow:

從(SELECT TOP 150 * FROM(選擇頂部PageSize * from outlet where id> LastOutletID order by id asc)as d order by id desc選擇top 150 * as b order by id asc

  1. 現在,如果您想要選擇下一個頂部行,請按照第1步獲取最後一個元素ID並保存它,然後只需將150添加到PageSize將會給您下一個151到300行
0

SQL Server解決方案: 1)在我的表中獲取總行數。

例如,從MYTABLE選擇count(1) - 500行

2)使用CTE爲我的表中的每一行分配邏輯行號。

3)使用行號間隔和BETWEEN子句選擇行數。

WITH CTE

AS (SELECT ROW_NUMBER()OVER(由MyColumn1,MyColumn2,MyColumn3)AS行#, 噸順序。* FROM MYTABLE噸 )

SELECT * FROM CTE其中間行# 150和300 按MyColumn1,MyColumn2,MyColumn3排序

4)重複步驟2)和3),使用下一行數量間隔,直到達到行總計數。

0

從Oracle 12開始,你有FETCH和OFFSET。

對於你的榜樣,你想要把150行成一個文件,並在接下來的150行到另一個文件:

Spool file1.txt 
select a from b 
order by a 
Fetch first 150 rows only; 
Spool off 
Spool file2.txt 
select a from b 
offset 150 rows 
Fetch next 150 rows only; 
spool off 

link顯示該行從Oracle 12.2限制條款的鐵路軌道圖文檔。

here示例中還包含「order by」,如果您正在尋找某些東西的頂部,這會很有意義。

以前的Oracle版本需要使用rownum和order-by,如其他答案所述。