我必須使用本地sql從sap中的oracle數據庫中選擇n行。在打開SQL查詢會像從oracle數據庫中選擇n條記錄
select * from myDB where size > 2000 upto n rows.
我從其他的帖子瞭解到相當於原生SQL查詢將
SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100
這是正確的?
我需要將rownum作爲數據庫表中的一個字段嗎?
我必須使用本地sql從sap中的oracle數據庫中選擇n行。在打開SQL查詢會像從oracle數據庫中選擇n條記錄
select * from myDB where size > 2000 upto n rows.
我從其他的帖子瞭解到相當於原生SQL查詢將
SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100
這是正確的?
我需要將rownum作爲數據庫表中的一個字段嗎?
ROWNUM
是Oracle在您執行SELECT
時生成的僞列。將值賦給ROWNUM
是在查詢返回一行之前完成的最後一件事 - 因此,查詢發出的第一行給出ROWNUM = 1,查詢發出的第二行給出ROWNUM = 2,依此類推。注意:這意味着,類似下面的語句將不返回行:
SELECT *
FROM SOME_TABLE
WHERE ROWNUM >= 2
爲什麼會出現這種不返回行?這是因爲查詢發出的第一行始終爲ROWNUM = 1,並且由於查詢僅查找ROWNUM> = 2的行,因此將不會選擇行,因爲第一個ROWNUM值爲1會應用於第一行排放。
無論其 - 如果你真的想要得到的所有行除第一個(或前10,或者你有什麼),你可以做這樣的:
SELECT *
FROM (SELECT *, ROWNUM AS INNER_ROWNUM
FROM SOME_TABLE
WHERE SOMETHING = SOMETHING_ELSE
ORDER BY WHATEVER) i
WHERE i.INNER_ROWNUM IN (1, 2, 3, 5, 7, 11, 13, 17, 19);
這裏我們使用了一個內部SELECT它獲取給定條件的所有行(SOMETHING = SOMETHING_ELSE),並將INNER查詢中的ROWNUM賦值給名爲INNER_ROWNUM的計算列,然後我們可以在外部查詢中將其用作普通列。
好的答案,但你在內部查詢中缺少一個ORDER BY' - 否則它沒有意義獲得行「5」但不是行「4」。 –
@JeffreyKemp - ORDER BY added。謝謝。 –
「ROWNUM是Oracle生成的僞列,當你執行SELECT時......或者更新或刪除。事實上,在任何聚合步驟發生之前,rownum都會被應用,因此:「select count(*)from ...其中rownum <2」只能返回0或1,並且是行存在的上帝測試。 –
使用rownum概念它是oracle中的一個僞列,通過使用這個概念我們可以實現TOP
關鍵字的功能。
select col1,col2,col3..coln from
(
select rownum rn,e.* from mydb where size>2000
)
where rn>N
注意:Col1到coln是您的表的列名稱。
SELECT *
FROM myDB
WHERE SIZE > 2000
AND ROWNUM <= 100
是一個在語法上正確的查詢。
我需要將rownum作爲DB表中的一個字段嗎?
否,ROWNUM
pseudocolumn受讓人,對於查詢所返回的每一行,一個數字,指示在其中的Oracle從一個表選擇行或一組連接的行的順序。所選的第一行具有1的ROWNUM
,第二行具有2,依此類推。
請注意,ROWNUM
適用於任何ORDER BY
條款之前。
所以:
SELECT *
FROM myDB
WHERE ROWNUM <= 10
ORDER BY column_name
可否選擇10行(它可以是任何的10行,而不一定是10行,其是首先在期望的順序)和然後將所需的列順序那些10行。
如果你想獲得與前N個值的行,列,那麼你需要應用ORDER BY
第一,然後限制行數:如果您使用的是Oracle 12然後
SELECT *
FROM (SELECT *
FROM myDB
ORDER BY column_name)
WHERE ROWNUM <= 10
他們已經實現了TOP-N查詢的新語法:
SELECT *
FROM myDB
ORDER BY column_name
FETCH FIRST 10 ROWS ONLY;
爲什麼不使用** Select Top **? – code
@code - 因爲Oracle不支持'TOP' –
是的,但是你已經有了oracle的等價物** rownum **爲什麼不工作 – code