【问题标题】:Sql - Returning row numbersSql - 返回行号
【发布时间】:2011-08-05 20:21:36
【问题描述】:

我有一个在 2 个表上运行的查询。子表对应父表。

换句话说,父表中有 6 个条目。

对于这 6 个条目中的每一个,都有一个返回 1000 条记录的外键。

我需要为 6 个条目中的每一个返回前 25 条记录。

我可以返回前 150 条记录,但不能返回它们的 ID。

select * from table where rownum <150

但这显然不会返回 EACH 的前 25 个条目。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您使用的是什么 RDBMS 以及哪个版本?
  • @Bill 您愿意告诉我们您正在使用的 RDBMS 吗?什么数据库,伙计?
  • Oracle 10g。使用 Hibernate,所以一旦我完成这第一步,可能需要编写 HQL。
  • 确保您接受这些答案之一,以便人们将来回答您的问题。

标签: sql oracle oracle10g greatest-n-per-group


【解决方案1】:

假设一个 RDBMS 支持窗口函数:

SELECT q.parent_column_a, q.child_column_b
    FROM (SELECT p.column_a AS parent_column_a, c.column_b AS child_column_b,
                 ROW_NUMBER() OVER(PARTITION BY p.primarykey ORDER BY c.primarykey) AS RowNum
              FROM parent p
                  INNER JOIN child c
                      ON p.primarykey = c.foreignkey) q
    WHERE q.RowNum <= 25

【讨论】:

  • 我比你早几秒发帖 :)
【解决方案2】:

如果您使用的是 SQL Server 或 Oracle,这就是解决方案。

select * from
(
    select p.parent_id, c.child_id, 
    row_number() over (partition by c.parent_id order by c.child_id) rn
    from parent p inner join child c on p.parent_id = c.parent_id
) subsel
where rn <= 25

【讨论】:

    【解决方案3】:
    SELECT TOP 25 SubEntries.SubEntryID
    FROM Entries Entries
    INNER JOIN SubEntries SubEntries
       ON Entries.EntryID = SubEntries.EntryID
    

    【讨论】:

    • -1 这不是 OP 需要的:“我需要为 6 个条目中的每一个返回前 25 条记录”
    • 条目是静态的/不变的,比如枚举列表还是什么?如果是这样,您可以获得每个条目的前 25 个,并使用 UNION 将结果连接到一个结果集中。
    • 条目是静态的。因此,对于 6 条记录中的每一条,我都需要检索前 25 条记录,以便填充到我的对象中。
    • 表 1 - A、B、C、D、E、F。表 2 - 每个条目都与外键相对应。现在对于表 1 中的每条记录,需要返回表 2 中的前 25 条记录。由此我可以填充我的对象。
    【解决方案4】:

    这适用于我的数据

    说明

    基本上,您使用 WHERE 子句仅选择子表 id 位于子表中与其父表对应的所有行的前 25 位的那些行。

    查询

    SELECT * -- Column List
    FROM ParentTable
        INNER JOIN SubTable
    WHERE SubTable.ID IN 
        (SELECT TOP 25 SubTable.ID 
         FROM SubTable s2 
         WHERE s2.ParentTableID = SubTable.ParentTableID)
    

    这几乎适用于任何 sql 数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多