Oracle分页:选择不带明确排序依据的distinct

Oracle分页:选择不带明确排序依据的distinct,oracle,pagination,Oracle,Pagination,我正在使用Oracle12c并尝试编写一个带有分页的查询。在一个简单的例子中,我们可以使用 SELECT * FROM T OFFSET a FETCH NEXT b ROWS ONLY; 或 但就我而言,我有两个问题: 我没有order_列,因为我的查询是针对未定义好的表动态生成的,所以我不知道它们是否有我可以排序的列。所以,这里的问题是,在这种情况下,我可以简单地使用ROWID来按ROWID排序吗? 大多数内部select或原始未分页查询包含DISTINCT,因此,ORDER BY ROW

我正在使用Oracle12c并尝试编写一个带有分页的查询。在一个简单的例子中,我们可以使用

SELECT * FROM T OFFSET a FETCH NEXT b ROWS ONLY;

但就我而言,我有两个问题:

我没有order_列,因为我的查询是针对未定义好的表动态生成的,所以我不知道它们是否有我可以排序的列。所以,这里的问题是,在这种情况下,我可以简单地使用ROWID来按ROWID排序吗? 大多数内部select或原始未分页查询包含DISTINCT,因此,ORDER BY ROWID导致异常。 从T ORDER BY ROWID中选择distinct列->非选定表达式
因此,我的问题是如何在没有预定义的order_列的情况下进行分页,以及如何使用order by rowid和distinct.

那么为什么不将rowid列作为每个select语句的一部分进行追加呢?对不起,我没有理解。从t order by rowid中选择distinct col,rowid将选择不同的col和rowid对,即VAL1、0000AAAFFFA、VAL1、0000AAAFFFB、VAL2、0000AAAFFFC、VAL3、0000AAAFFFD。但是复制VAL1是错误的结果,我想折叠它们。如果要生成查询,为什么不按所有选定列排序?是否确实需要在SQL中进行分页?而不是简单地打开一个游标,让客户端应用程序获取结果页面?您可以从“选择”列表中按列排序。根据正在排序的数据量和可用索引,这可能会导致效率低下。您可以省略order by,并希望在不丢失或复制太多行的情况下获得预期的结果,如果有其他会话,这将是一个问题。例如,从oracle文档中,如果您使用导入和导出实用程序删除并重新插入一行,则其rowid可能会更改。如果删除一行,Oracle可能会将其rowid重新分配给以后插入的新行。因此,rowid对于排序是不可行的
SELECT * FROM (
        SELECT t.*,ROWNUM AS rn FROM (
                SELECT t.* FROM test_table t
                 WHERE col = ?
                 ORDER BY order_col) t
         WHERE ROWNUM <= b
) WHERE rn >= a;