1

我有一个存储过程,它获取附加到给定配置的项目列表(每个项目都附加到一个配置;如果不是(即字段是NULL),那么我们认为它附加到默认配置(其字段ISDEFAULT1) .我想使用分页获取项目。我记得该ROWNUM字段从一个开始,所以我写了(第一页使用0,每页十个项目):

SELECT *
FROM 
  ITEMS item
WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

这个请求给我返回了零个结果。

我将其更改为:

SELECT item.NAME,
item.ITEMID,
item.CONFIGID,
ROWNUM
FROM 
  ITEMS item
WHERE
      (ROWNUM - 1) >= 0 and
      (ROWNUM - 1) < (0 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

它奏效了!ROWNUMSELECT语句中添加解决了这个问题。

然后我尝试了:

SELECT *
FROM 
  ITEMS item
WHERE
  ROWNUM >= (0 + 1) and
  ROWNUM < (0 + 1 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

我写回了SELECT *语句并将 移到了- 1比较运算符的另一侧(因此它们变成了+ 1)。这也有效。

有人可以解释为什么我的第一个查询不起作用并且产生零结果,而其他两个像魅力一样工作吗?

4

1 回答 1

0

我认为 ROWNUM 没有问题。你可以尝试执行:

SELECT *
  FROM ITEMS item
 WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10);


SELECT item.NAME,
       item.ITEMID,
       item.CONFIGID,
       ROWNUM
  FROM ITEMS item
 WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10);

两者都应该可以正常工作。这意味着您对过滤器的第二部分有问题。以下子查询

(SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

是不相关的。所以它总是为任何记录返回相同的结果。我认为您必须按 item.CONFIGID 将括号添加到条件中:

(item.CONFIGID = 0) or 
(
item.CONFIGID is null and
exists (SELECT ...)
)

或者

(item.CONFIGID = 0 or     
item.CONFIGID is null) and
exists (SELECT ...)

我认为这是你的问题。但没有看到数据就不确定。

于 2013-12-13T15:16:18.547 回答