我有一个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;
现在将任何where子句放在最里面的位(例如,我将f.c1 =‘1’放入)。
BBB =页面大小。AAA =起点