【发布时间】:2016-11-03 21:30:45
【问题描述】:
给定的;
CREATE TABLE T1 (ID INTEGER, DESCRIPTION VARCHAR2(20));
INSERT INTO T1 VALUES (1,'ONE');
INSERT INTO T1 VALUES (2,'TWO');
INSERT INTO T1 VALUES (3,'THREE');
INSERT INTO T1 VALUES (4,'FOUR');
INSERT INTO T1 VALUES (5,'FIVE');
COMMIT;
为什么会这样;
SELECT * FROM
( SELECT ROWNUM, ID, DESCRIPTION
FROM T1)
WHERE MOD(ROWNUM,1)=0;
返回
ROWNUM ID DESCRIPTION
------ -------------------------------------- --------------------
1 1 ONE
2 2 TWO
3 3 THREE
4 4 FOUR
5 5 FIVE
而;
SELECT * FROM
( SELECT ROWNUM, ID, DESCRIPTION
FROM T1)
WHERE MOD(ROWNUM,2)=0;
返回零行???
困惑,预期 ROWNUM=(2,4) 将被返回...
【问题讨论】:
-
内部选择中的别名 rownum 并引用 where 子句中的别名应该可以工作...
-
SELECT * FROM (SELECT ROWNUM as rn, ID, DESCRIPTION FROM T1) as t WHERE MOD(t.rn, 2)=0;
-
ROWNUMs 是在WHERE子句过滤了行之后分配的,因此任何消除ROWNUM1 的过滤器都将阻止返回任何行。同样,过滤掉ROWNUM2 的任何查询都将阻止返回除第 1 行之外的任何行,例如WHERE MOD(ROWNUM, 5) <= 3将只返回前 3 行,无论表中还有多少行,都等价于WHERE ROWNUM <= 3谓词。 -
这似乎是Selecting the second row of a table using rownum 的变体。无论如何,相同的基本解释。