我有一个存储过程,它获取附加到给定配置的项目列表(每个项目都附加到一个配置;如果不是(即字段是NULL
),那么我们认为它附加到默认配置(其字段ISDEFAULT
为1
) .我想使用分页获取项目。我记得该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));
它奏效了!ROWNUM
在SELECT
语句中添加解决了这个问题。
然后我尝试了:
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
)。这也有效。
有人可以解释为什么我的第一个查询不起作用并且产生零结果,而其他两个像魅力一样工作吗?