3

我有一个如下所示的 SQL 查询:

SELECT foo "c0",
       bar "c1",
       baz "c2",
       ...
FROM   some_table
WHERE  ...

为了应用限制,并且只返回来自该查询的记录子集,我使用以下包装 SQL:

SELECT *
FROM   (
    SELECT t.*,
           ROW_NUMBER() OVER (ORDER BY ...) rnum
    FROM   (
        ... original SQL goes here ...
    ) t
)
WHERE rnum BETWEEN 1 AND 10

我的问题是原始查询在与其他表的大量连接中选择了超过 1000 列。Oracle 对每个表或视图有 1000 列的内部限制,显然我用来限制结果集的包装 SQL 正在创建一个应用此限制的临时视图,导致整个事情失败。

是否有另一种分页方法不会创建这样的视图,或者不会受到 1000 列限制的影响?

我对将工作分解成块的建议不感兴趣,而不是选择 > 1000 列等,因为我已经完全了解所有这些方法。

4

3 回答 3

3

好的,这会比你计划的更糟糕,但我的意思是你可以这样尝试分页:

WITH CTE AS
(
    ... original SQL goes here ...
)

SELECT A.*
FROM CTE A
INNER JOIN (SELECT  YourKey,
                    ROW_NUMBER() OVER (ORDER BY ...) rnum
            FROM CTE) B
ON A.YourKey = B.YourKey
WHERE rnum BETWEEN 1 AND 10;
于 2012-11-09T20:31:22.880 回答
2

你不能有超过 1000 列的视图,所以稍微作弊。

select *
  from foo f, foo2 f2
 where (f.rowid, f2.rowid) in (select r, r2
                                 from (select r, r2, rownum rn
                                         from (select /*+ first_rows */ f.rowid r, f2.rowid r2
                                                 from foo f, foo2 f2
                                                where f.c1 = f2.a1 
                                                  and f.c2 = '1'
                                                order by f.c1))
                                where rn >= AAA
                                  and rownum <= BBB)


order by whatever;

现在将任何 where 子句放在最里面的位(例如我放 f.c1 = '1')。

BBB = 页面大小。AAA = 起点

于 2012-11-09T20:50:13.693 回答
-1

问题是分页还是只返回前 10 行?如果是后者,你可以这样做:

SELECT foo "c0",
       bar "c1",
       baz "c2",
       ...
FROM   some_table
WHERE  ... and
       rownum <= 10
于 2012-11-09T19:52:53.523 回答