【问题标题】:how to select even records from a table in oracle?oracle如何从表中选择偶数记录?
【发布时间】:2013-11-16 04:00:23
【问题描述】:

我正在使用下面的查询来检索偶数记录。但结果是它没有显示任何行

select ename,job from emp where mod(rownum,2)=0;

为什么 mod(rownum,2) 在 where 条件下不起作用

能否请您也提供查询以选择奇数记录

这个查询有什么问题吗?

请给点建议..

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    它不起作用,因为:对于第一行 ROWNUM1 并且在这种情况下,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。前两个查询不起作用!
                      猜你喜欢
                      • 2011-08-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多