2015-08-19 90 views
0

我必須使用本地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作爲數據庫表中的一個字段嗎?

+0

爲什麼不使用** Select Top **? – code

+2

@code - 因爲Oracle不支持'TOP' –

+0

是的,但是你已經有了oracle的等價物** rownum **爲什麼不工作 – code

回答

1

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的計算列,然後我們可以在外部查詢中將其用作普通列。

+0

好的答案,但你在內部查詢中缺少一個ORDER BY' - 否則它沒有意義獲得行「5」但不是行「4」。 –

+0

@JeffreyKemp - ORDER BY added。謝謝。 –

+0

「ROWNUM是Oracle生成的僞列,當你執行SELECT時......或者更新或刪除。事實上,在任何聚合步驟發生之前,rownum都會被應用,因此:「select count(*)from ...其中rownum <2」只能返回0或1,並且是行存在的上帝測試。 –

0

使用rownum概念它是oracle中的一個僞列,通過使用這個概念我們可以實現TOP關鍵字的功能。

select col1,col2,col3..coln from 
(
select rownum rn,e.* from mydb where size>2000 
) 
where rn>N 

注意:Col1到coln是您的表的列名稱。

1
SELECT * 
FROM myDB 
WHERE SIZE > 2000 
AND ROWNUM <= 100 

是一個在語法上正確的查詢。

我需要將rownum作爲DB表中的一個字段嗎?

否,ROWNUMpseudocolumn受讓人,對於查詢所返回的每一行,一個數字,指示在其中的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; 
相關問題