Oracle LIMIT和1000列限制

时间:2012-11-09 19:42:51

标签: sql oracle pagination

我有一个如下所示的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列等,因为我已经完全了解所有这些方法。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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 = pagesize。 AAA =起点

答案 2 :(得分:0)

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

SELECT foo "c0",
       bar "c1",
       baz "c2",
       ...
FROM   some_table
WHERE  ... and
       rownum <= 10