使用ROWNUM从Oracle中选择过滤值

时间:2014-09-08 10:30:56

标签: sql oracle

我有一个要求,其中我需要找到从结果集返回的记录的记录号。我知道我可以使用ROWNUM从结果集中获取记录号,但我的问题略有不同。以下是详细信息

表:ProcessSummary 列:

PS_PK ProcessId StepId AsscoiateId ProcessName AssetAmount
145     25        50                 Process1    3,500.00
267     26               45          Process2    4,400.00
356     27        70                 Process3    2,400.00
456     28        80     90          Process4      780.00   
556     29        56     67          Process5    4,500.00
656               45     70          Process6    6,000.00
789     31               75          Process7    8,000.00

现在我需要做的是当ProcessId或StepId OR AssociateId为NULL时从ProcessSummary表中获取所有记录。我写了下面的查询

select * from  ProcessSummary where ProcessId IS NULL OR StepId IS NULL OR AsscoiateId IS NULL

正如预期的那样,我得到了返回结果集中的第1,第2,第3,第6和第7条记录。 现在我需要的是获得记录编号1,2,3,6,7。我尝试使用如下的ROWNUM,但我得到的值是1,2,3,4,5而不是1,2,3,6,7。

select ROWNUM from  ProcessSummary where ProcessId IS NULL OR StepId IS NULL OR AsscoiateId IS NULL

是否可以按照我想要的顺序获取ROWNUM值,如果是,那么请告诉我我该怎么做。此外,如果不能使用ROWNUM,那么我可以用什么来获得我想要的结果的结果。

任何帮助都会得到很大的帮助,因为我无法在网上找到太多关于此类要求的信息。

由于

Vikeng21

1 个答案:

答案 0 :(得分:0)

rownum是一个内部编号,仅根据当前查询结果为您提供行号,因此编号与特定记录无关,并且在您更改数据或查询时它会发生变化。

但是你要求的编号已经在你的桌子上了。您似乎只需要SELECT PS_PK ..PS_PK是表格中包含您想要的实际数字的字段。

您可以使用分析函数生成编号,然后过滤该查询。但是,您需要一些字段来订购。在这种情况下,我选择了PS_PK,但它可以是另一个字段,例如ProcessName或其他字段的组合。

select
  *
from
  (select
    dense_rank() over (order by PS_PK) as RANKING,
    p.*
  from
    ProcessSummary p)
where
  ProcessId IS NULL OR StepId IS NULL OR AsscoiateId IS NULL

因此,在此查询中,首先计算从内部查询返回的每一行的编号。编号作为字段RANKING返回。然后其他查询进一步过滤,但仍将返回带有原始编号的字段RANKING。

而不是dense_rank还有rankrow_number。差异很微妙,但您可以试验并阅读一些文档herehere来了解差异,看看哪一个最适合您。

请注意,这可能会降低查询速度,因为内部查询首先为表中的每一行生成一个数字(现在该级别没有过滤)。