我有一个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列,等等,我已经完全了解所有这些方法的。
你不能有超过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 =起点
好吧,这将执行比你打算什么更糟糕,但我的观点是,你可以尝试分页是这样的:
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;
该问题是分页或刚刚回国的前10行? 如果是后者,你可以这样做:
SELECT foo "c0",
bar "c1",
baz "c2",
...
FROM some_table
WHERE ... and
rownum <= 10