Sql 用于分页的oracle左联接查询

Sql 用于分页的oracle左联接查询,sql,oracle,paging,Sql,Oracle,Paging,假设最新的组1、组2各有2个用户 然后上述查询将返回group1的2条记录 我想按组记录设置基于rownum的记录,这样我就可以有group1和group2ie:上面的查询应该返回4条记录 我尝试了密集排列,但我必须按未创建的组id排序记录 有人能问我这个问题吗 您的查询在语法和逻辑上都不正确 如果您正在寻找分页查询,那么首先需要了解ROWNUM是如何工作的 比如说, 我有下面的员工表 select rownum rnum, * from group g left join user u

假设最新的组1、组2各有2个用户

然后上述查询将返回group1的2条记录

我想按组记录设置基于rownum的记录,这样我就可以有group1和group2ie:上面的查询应该返回4条记录

我尝试了密集排列,但我必须按未创建的组id排序记录

有人能问我这个问题吗

您的查询在语法和逻辑上都不正确

如果您正在寻找分页查询,那么首先需要了解ROWNUM是如何工作的

比如说,

我有下面的员工表

select rownum rnum, * from group g 
  left join user u on u.group_id = g.id 
  where rnum between 1, 2
  order by g.created_at desc;
我需要第五、第六、第七和第八名高薪员工:

您可以使用其他分页方式。如果您在12c上,您可以使用新的Top-N行限制功能。查看链接了解更多详细信息

我尝试了密集排序,但我必须按组id排序,而不是 创建于

这是个好主意:

SQL> SELECT empno, sal
  2  FROM   (SELECT empno, sal, ROWNUM AS rnum
  3          FROM   (SELECT empno, sal
  4                  FROM   emp
  5                  ORDER BY sal DESC
  6                 )
  7          WHERE rownum <= 8)
  8  WHERE  rnum >= 5;

     EMPNO        SAL
---------- ----------
      7698       2850
      7782       2450
      7499       1600
      7844       1500

SQL>
或者,您可以使用:

        ID NAME       CREATED_AT  USID
---------- ---------- ----------- ----------
         2 Group2     2015-01-09  Kyle
         2 Group2     2015-01-09  Eric
         3 Group3     2015-01-12  Kenny
         3 Group3     2015-01-12  Butters

我想您正在寻找带有partition by子句的行号:


MySQL是如何参与进来的?此外,如果您添加一些示例表数据和预期输出,将更容易为您提供帮助。您不在乎选择了组的哪两条记录吗?您只需要任意两条?您的查询是错误的,使用ROWNUM在逻辑上是不正确的。您需要使用一个简单的分页查询。问题是我正在连接两个表。我需要一个distinctby GROUP.ID rownumber以正确分页。问题是我正在连接两个表。我需要一个distinctby GROUP.ID行号以进行正确的分页。density_rank by创建于。但我需要按Group.ID进行排名。如果我使用where条件,第二个查询就会出现问题。我没有捕获它。正如我所看到的,还有其他的回答者。查询仅显示最近创建的两个组及其成员。也许你想用g.ID desc来计算高阶的秩?
SQL> SELECT empno, sal
  2  FROM   (SELECT empno, sal, ROWNUM AS rnum
  3          FROM   (SELECT empno, sal
  4                  FROM   emp
  5                  ORDER BY sal DESC
  6                 )
  7          WHERE rownum <= 8)
  8  WHERE  rnum >= 5;

     EMPNO        SAL
---------- ----------
      7698       2850
      7782       2450
      7499       1600
      7844       1500

SQL>
select id, name, created_at, usid
  from (
    select dense_rank() over (order by created_at desc) rnk, 
        g.id, g.name, g.created_at, u.id usid
      from groups g left join users u on u.group_id = g.id)
  where rnk < 3 order by id
        ID NAME       CREATED_AT  USID
---------- ---------- ----------- ----------
         2 Group2     2015-01-09  Kyle
         2 Group2     2015-01-09  Eric
         3 Group3     2015-01-12  Kenny
         3 Group3     2015-01-12  Butters
select g.id, name, created_at, u.id usid
  from (
    select * from (
        select * from groups order by created_at desc) 
      where rownum < 3 ) g
  left join users u on g.id = u.group_id
  order by g.id
select id, name, created_at, usid
from (select row_number() over (partition by g.id order by created_at desc) as seqnum, 
             g.id, g.name, created_at, u.id as usid
      from groups g left join
           users u
           on u.group_id = g.id
     ) ug
where seqnum <= 2
order by id;