如何檢索(選擇)表中有一半記錄(例如,具有1000行的表),從表中檢索500(50%)。 (在這種情況下,我可以使用rownum,因爲我們知道行的確切數量(1000) - select * from table where rownum <= 500
),但是我必須計算每個表以實現該聲明。如何從表中檢索一半記錄 - Oracle 11g
你認爲我能做到這一點的最佳方式是什麼?
如何檢索(選擇)表中有一半記錄(例如,具有1000行的表),從表中檢索500(50%)。 (在這種情況下,我可以使用rownum,因爲我們知道行的確切數量(1000) - select * from table where rownum <= 500
),但是我必須計算每個表以實現該聲明。如何從表中檢索一半記錄 - Oracle 11g
你認爲我能做到這一點的最佳方式是什麼?
好了,你可以指望的行,並選擇半:
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 ...
在這種情況下的語法示例會更緊湊。
Upvoted for'sample'語法,如果「約一半」足以滿足OP,這將是正確的解決方案。 –
我用它'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
隨着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
'SELECT NULL'我認爲你的語法不正確。 –
@LalitKumarB,ok thx。我記得在SQL Server oredring直接會導致錯誤。在oracle中它正在工作。 –
不需要select語句,'ORDER BY NULL'就足夠了。 –
如果您是在Oracle 12c
,您可以使用前N個行限制特性,它允許限制行數的百分比。
例如,在我SCOTT
模式我有14 rows
EMP
表,我想先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>
你要哪一行的一半?
這得到每隔一行...
Select * from table t
Where Mod(rownum, 2) = 0
這得到上半場...
Select * from table t
Where rownum <=
(Select count(*)
from table)/2
第一個查詢肯定有語法錯誤。我想這是SQL服務器的語法。在Oracle中它肯定會失敗。 –
「Mod」使其符合Oracle語法標準 –
據我所知去,以執行此操作的最佳方式是通過執行下面的代碼塊:
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);
上有一個DBA_TABLES NUM_ROWS列,但我認爲這是隻有當表您正在使用什麼版本的Oracle的分析 – davegreen100
刷新?而且,「一半」的精確度應該是多少? –
Oracle 11g,可能是隨機的 – Fulvio