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