2015-06-11 34 views
2

如何檢索(選擇)表中有一半記錄(例如,具有1000行的表),從表中檢索500(50%)。 (在這種情況下,我可以使用rownum,因爲我們知道行的確切數量(1000) - select * from table where rownum <= 500),但是我必須計算每個表以實現該聲明。如何從表中檢索一半記錄 - Oracle 11g

你認爲我能做到這一點的最佳方式是什麼?

+1

上有一個DBA_TABLES NUM_ROWS列,但我認爲這是隻有當表您正在使用什麼版本的Oracle的分析 – davegreen100

+0

刷新?而且,「一半」的精確度應該是多少? –

+0

Oracle 11g,可能是隨機的 – Fulvio

回答

5

好了,你可以指望的行,並選擇半:

select * 
from my_table 
where rownum <= (select count(*)/2 from my_table) 

這將傾向選擇在物理段內連續的行。

或者......

select * 
from (select rownum rn, * from my_table) 
where mod(rn,2) = 0 

這將往往選擇「隔」行,所以你會得到相當甚至從物理數據段擴散。

或者......

select * 
from my_table sample (50) 

這將是該行的大約一半。

或者......

select * 
from my_table sample block (50) 

這將是從大約一半以下段的高水位標記的數據塊的行。

可能有很多不同的方法可用,你想要哪一個可能取決於你是否想要僞隨機選擇。

如果你想使用查詢的輸出,使用類似:

select ... 
from (select * 
     from my_table 
     where rownum <= (select count(*)/2 from my_table)) my_table 
join ... 

在這種情況下的語法示例會更緊湊。

+0

Upvoted for'sample'語法,如果「約一半」足以滿足OP,這將是正確的解決方案。 –

+0

我用它'select * from mytable where rownum <=(select count(*)/ 2 form mytable)'但是,如果我只是諮詢一個表,那麼如果不得不諮詢3個表, select * from table1 a = bn內連接表2 b和內連接表3 c am = cm其中rownum <=(select count(*)/ 2 form mytable) – Fulvio

2

隨着NTILE窗函數:

select * from (SELECT *, NTILE(2) OVER(ORDER BY (SELECT NULL FROM DUAL)) nt FROM TableName) as t 
where nt = 1 

或:

select * from (SELECT *, NTILE(2) OVER(ORDER BY NULL) nt FROM TableName) as t 
where nt = 1 
+1

'SELECT NULL'我認爲你的語法不正確。 –

+0

@LalitKumarB,ok thx。我記得在SQL Server oredring直接會導致錯誤。在oracle中它正在工作。 –

+0

不需要select語句,'ORDER BY NULL'就足夠了。 –

2

如果您是在Oracle 12c,您可以使用前N個行限制特性,它允許限制行數的百分比

例如,在我SCOTT模式我有14 rowsEMP表,我想先50 percent rows基於ORDER BY SAL:

SQL> SELECT empno, sal FROM emp 
    2 ORDER BY sal 
    3 FETCH FIRST 50 PERCENT ROWS ONLY; 

    EMPNO  SAL 
---------- ---------- 
     7369  800 
     7900  950 
     7876  1100 
     7521  1250 
     7654  1250 
     7934  1300 
     7844  1500 

7 rows selected. 

SQL> 
0

你要哪一行的一半?

這得到每隔一行...

Select * from table t 
Where Mod(rownum, 2) = 0 

這得到上半場...

Select * from table t 
Where rownum <= 
    (Select count(*) 
    from table)/2 
+0

第一個查詢肯定有語法錯誤。我想這是SQL服務器的語法。在Oracle中它肯定會失敗。 –

+0

「Mod」使其符合Oracle語法標準 –

0

據我所知去,以執行此操作的最佳方式是通過執行下面的代碼塊:

SELECT * FROM TABLE_NAME
WHERE ROWNUM < =(SELECT COUNT(*)/ 2 FROM table_name);

而獲得下半年:

SELECT * FROM
(SELECT ROWNUM AS RN,表名* FROM表名)
WHERE RN>(SELECT COUNT(*)/ 2 FROM table_name);