我該如何在Oracle的表中選擇第一個x行,然後是下一個x等等?我知道我可以使用TOP/LIMIT,然後我得到第一個150行。選擇前150行,然後是下150等等?
編輯:爲什麼?我想第一個150級的輸出複製到一個文件,然後在接下來的150到另一個文件等等...
我該如何在Oracle的表中選擇第一個x行,然後是下一個x等等?我知道我可以使用TOP/LIMIT,然後我得到第一個150行。選擇前150行,然後是下150等等?
編輯:爲什麼?我想第一個150級的輸出複製到一個文件,然後在接下來的150到另一個文件等等...
在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條件要應用在排序之後。
我假設你正在試圖做的分頁,如果這樣你就可以做這樣的:
讓pageSize
是150
SELECT * FROM
(
SELECT a.*, rownum r__
FROM
(
SELECT * FROM tblName c
) a
WHERE rownum < ((pageNumber * pageSize) + 1)
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
(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
保存選擇的ID在ViewState中的一個會話對象即LastOutletID
聲明一個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
SQL Server解決方案: 1)在我的表中獲取總行數。
例如,從MYTABLE選擇count(1) - 500行
2)使用CTE爲我的表中的每一行分配邏輯行號。
3)使用行號間隔和BETWEEN子句選擇行數。
WITH CTEAS (SELECT ROW_NUMBER()OVER(由MyColumn1,MyColumn2,MyColumn3)AS行#, 噸順序。* FROM MYTABLE噸 )
SELECT * FROM CTE其中間行# 150和300 按MyColumn1,MyColumn2,MyColumn3排序
4)重複步驟2)和3),使用下一行數量間隔,直到達到行總計數。
從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,如其他答案所述。
問題是:爲什麼? – vulkanino 2012-03-09 09:15:17
我想將第一個150個輸出複製到一個文件中,然後將下一個150複製到另一個文件中,等等...... – sabisabi 2012-03-09 10:48:22
帶有代碼?或直接從甲骨文?來自oracle的 – vulkanino 2012-03-09 10:49:37