Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用ROWNUM从Oracle中选择筛选值_Sql_Oracle - Fatal编程技术网

Sql 使用ROWNUM从Oracle中选择筛选值

Sql 使用ROWNUM从Oracle中选择筛选值,sql,oracle,Sql,Oracle,我有一个要求,其中我需要找到从resultset返回的记录的记录编号。我知道我可以使用ROWNUM从resultset获取记录编号,但我的问题略有不同。详情如下 表:流程摘要 栏目: 现在我需要做的是,当ProcessId、StepId或AssociateId中的任何一个为空时,从ProcessSummary表中获取所有记录。我写了下面的查询 select * from ProcessSummary where ProcessId IS NULL OR StepId IS NULL OR As

我有一个要求,其中我需要找到从resultset返回的记录的记录编号。我知道我可以使用ROWNUM从resultset获取记录编号,但我的问题略有不同。详情如下

表:流程摘要 栏目:

现在我需要做的是,当ProcessId、StepId或AssociateId中的任何一个为空时,从ProcessSummary表中获取所有记录。我写了下面的查询

select * from  ProcessSummary where ProcessId IS NULL OR StepId IS NULL OR AsscoiateId IS NULL
正如预期的那样,我在返回的结果集中得到了第一、第二、第三、第六和第七条记录。 现在我需要的是记录编号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

rownum
是一种内部编号,它仅基于当前查询结果为您提供一个行号,这样编号就不会绑定到特定记录,并且在您更改数据或查询时会发生更改

但是您要求的编号已经在您的表中。看起来您只需要
选择PS_PK..
PS_PK
是表中包含所需实际数字的字段

可以使用分析函数生成编号,然后过滤该查询。不过,您需要一些字段来进行排序。在本例中,我选择了
PS\u 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
因此,在这个查询中,首先计算从内部查询返回的每一行的编号。编号作为字段排名返回。然后,另一个查询将进一步过滤,但仍将返回具有原始编号的字段排名

除了
密集列
之外,还有
行数
。差异是微妙的,但你可以通过实验和阅读一些文档来了解差异,看看哪一个最适合你


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

为什么不通过
PS_PK
ProcessName
过滤您的结果?@yamny请检查我在下面对@GolezTrol的更新。@GolezTrol我刚刚为上面创建了主键序列以供说明。但实际上,PS_PK是一个序列生成的格式编号,例如:1918165。我不理解那个说法。行没有特定的编号。如果有,您根本不需要添加主键。@GolezTrol我已经更新了我的问题。是的,我能理解你的意思,但我想问的是,使用ROWNUM是否有可能得到我想要的结果。如果没有,那么你能建议一些其他的选择,我可以使用。我现在明白了。因此,您希望有一个虚拟编号(基于,比如说PS_PK),并显示该编号。我已经添加了一些代码来实现这一点。@GolezTrol非常感谢。您的上述解决方案有效:)
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