甲骨文LIMIT和1000列限制(Oracle LIMIT and 1000 column rest

2019-07-03 16:48发布

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

Answer 1:

你不能有超过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;

现在把任何其中在最内位条款(例如,我把f.c1 =“1”)。

BBB =页面大小。 AAA =起点



Answer 2:

好吧,这将执行比你打算什么更糟糕,但我的观点是,你可以尝试分页是这样的:

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;


Answer 3:

该问题是分页或刚刚回国的前10行? 如果是后者,你可以这样做:

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


文章来源: Oracle LIMIT and 1000 column restriction