如何从表中检索一半记录 - Oracle 11g

Ful*_*vio 3 sql oracle

如何从表中检索(选择)一半记录,例如,包含1000行的表,从表中检索500(50%).(在这种情况下,我可以使用rownum,因为我们知道行的确切数量(1000) - select * from table where rownum <= 500),但我必须计算每个表来实现该语句.

你认为我能做到这一点的最佳方式是什么?

Dav*_*dge 10

好吧,你可以计算行数并选择一半:

select *
from   my_table
where  rownum <= (select count(*)/2 from my_table)
Run Code Online (Sandbox Code Playgroud)

这将倾向于选择在物理段内连续的行.

要么 ...

select *
from   (select rownum rn, * from my_table)
where  mod(rn,2) = 0
Run Code Online (Sandbox Code Playgroud)

往往会选择"每隔一行",因此您可以从物理数据段中获得相当均匀的扩展.

要么 ...

select *
from   my_table sample (50)
Run Code Online (Sandbox Code Playgroud)

那将是大约一半的行.

要么 ...

select *
from   my_table sample block (50)
Run Code Online (Sandbox Code Playgroud)

这将是来自段的高水位线下方的大约一半数据块的行.

可能有很多不同的方式,你想要哪一种可能取决于你是否想要所选择的伪随机.

如果要使用查询的输出,请使用以下内容:

select ...
from   (select *
        from   my_table
        where  rownum <= (select count(*)/2 from my_table)) my_table
join   ...
Run Code Online (Sandbox Code Playgroud)

在那种情况下,SAMPLE语法会更紧凑.