oracle如何从表中选择偶数记录?
Posted
技术标签:
【中文标题】oracle如何从表中选择偶数记录?【英文标题】:how to select even records from a table in oracle? 【发布时间】:2013-11-16 04:00:23 【问题描述】:我正在使用下面的查询来检索偶数记录。但结果是它没有显示任何行
select ename,job from emp where mod(rownum,2)=0;
为什么 mod(rownum,2) 在 where 条件下不起作用
能否请您也提供查询以选择奇数记录
这个查询有什么问题吗?
请给点建议..
【问题讨论】:
【参考方案1】:它不起作用,因为:对于第一行 ROWNUM
是 1
并且在这种情况下,MOD(ROWNUM,2)
是 1
并且由于您的 WHERE
语句是 MOD(ROWNUM,2)=0
然后这减少到 @987654328 @ 并且该行被丢弃。随后的行将针对 1 的ROWNUM
进行测试(因为前一行不再在输出中并且没有行号),这将再次失败并被丢弃。重复,令人作呕,所有行均未通过WHERE
测试并被丢弃。
如果您尝试使用 WHERE MOD(ROWNUM,2)=1
以这种方式获取奇数行,那么它将仅返回第一行,第二行以及随后的行将无法通过测试,并且永远不会包含在查询中。
正如 Vijaykumar Hadalgi 建议的那样,您需要在子查询中选择 ROWNUM(它可以在没有 where 子句限制的情况下对所有行进行编号),然后在外部查询中执行测试以限制行:
SELECT ename, job
FROM (
SELECT ename,
job,
ROWNUM AS row_id -- Generate ROWNUM second.
FROM (
SELECT ename, job
FROM Emp
ORDER BY ename -- ORDER BY first.
)
)
WHERE MOD( row_id, 2 ) = 0; -- Filter third.
SQLFIDDLE
【讨论】:
【参考方案2】:试试这个
要查找 EVEN 行详细信息数,您可以使用此代码。 这个对 oracle SQL 和 mysql 都很熟悉。
select * from (select ename,job, ROWNUM AS rn from emp) where mod(rn, 2) = 0;
要查找 ODD 行详细信息数,您可以使用此代码。
select * from (select ename,job, ROWNUM AS rn from emp) where mod(rn, 2) <> 0;
【讨论】:
【参考方案3】:-- for selecting rows 1,3,5,7....
SELECT EMPLOYEE_ID,FIRST_NAME, LAST_NAME FROM
(
SELECT DENSE_RANK OVER(ORDER BY EMPLOYEE_ID)AS RANK, EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM EMPLOYEES
)
WHERE MOD(RANK,2)=1
-- for selecting rows 2,4,6,8....
SELECT EMPLOYEE_ID,FIRST_NAME, LAST_NAME FROM
(
SELECT DENSE_RANK OVER(ORDER BY EMPLOYEE_ID)AS RANK, EMPLOYEE_ID, FIRST_NAME, LAST_NAME
FROM EMPLOYEES
)
WHERE MOD(RANK,2)=0
【讨论】:
【参考方案4】:select * from emp where empid in (select decode(mod(rownum,2),0, empid,null) from emp); --Alternate record Even numbered
从表中获取偶数记录
【讨论】:
上面的代码是正确的,首先你执行查询@Sai【参考方案5】:或者你可以试试这个:
这里内部查询将获取所有偶数记录的主键值,并基于此我们可以获取所有这些记录的详细信息。
SELECT * FROM EMP WHERE EMPNO IN
(
SELECT CASE MOD(ROWNUM,2)
WHEN 0 THEN EMPNO
END
FROM EMP
);
这将获取所有奇数记录
SELECT * FROM EMP WHERE EMPNO IN
(
SELECT CASE MOD(ROWNUM,2)
WHEN 1 THEN EMPNO
END
FROM EMP
);
【讨论】:
【参考方案6】:这样就可以了:
Select * from (Select rownum as No_of_Row, E.* from emp E)
Where mod(No_of_Row,2)=0;
【讨论】:
【参考方案7】:使用下面的查询你会得到结果:
SELECT empno,ename,slno
FROM ( SELECT empno,ename,ROW_NUMBER() OVER
(ORDER BY empno desc) AS slno FROM emp ) result WHERE mod(slno,2) = 1;
【讨论】:
【参考方案8】:使用下面的查询,
select * from (select ename,job, ROWNUM as row_id from emp) where mod(row_id, 2) = 0;
【讨论】:
【参考方案9】:Select ename, job from emp where mod(id, 2) =0 ;
如果表有标识列,您可以尝试使用 id
列而不是 rownum
【讨论】:
【参考方案10】:row num 表示结果表中的行号,而不是原始表中的行号。 因此,首先将其分配给 row_id 或任何变量并使用该变量。
【讨论】:
【参考方案11】:请尝试:
select * from emp where (rowid,0) in (select rowid, mod(rownum,2) from emp)
输出:- 2 4 6
Select * from emp where (rowid,1) in (select rowid, mod(rownum,2) from emp);
输出:1,3,5..
否则这会起作用
这个:
奇怪:
select * from
(
SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col1 DESC) AS 'RowNumber',
FROM table1
) d
where (RowNumber % 2) = 1
甚至:
select * from
(
SELECT col1, col2, ROW_NUMBER() OVER(ORDER BY col1 DESC) AS 'RowNumber',
FROM table1
) d
where (RowNumber % 2) = 0
【讨论】:
查询工作..但是为什么 mod(rownum,2) 在 where 条件下不起作用 @TeamDataViz。前两个查询不起作用!以上是关于oracle如何从表中选择偶数记录?的主要内容,如果未能解决你的问题,请参考以下文章
Rownum 或 Fetch/offset 适合选择和处理数百万条记录
如何在Oracle中添加一个策略,用户可以从表中选择所有数据,并且只能插入、更新、删除有条件的数据