oracle表1000列限制,关于sql:Oracle LIMIT和1000列限制

我有一个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列",您的数据模型似乎有些奇怪。

@a_horse_with_no_name:如果奇怪的话,你的意思是我有超过1000条关于单个实体的离散数据,这些数据对我的特定域都是相关和必要的,但是这在所有域的集合中非常罕见,那么你就是正确。完全没有帮助,但是正确的。

在30年的数据库设计中,我从未见过需要超过1000列的实体。如果您的模型可以优化并因此解决您的问题的根本原因而不是对抗症状,我不会感到惊讶

你桌子上有钥匙吗?我猜你可以通过加入同一个表来进行分页,但是只选择键列和你的ROW_NUMBER并在之后进行过滤。听起来不是很理想,但却是一种方式

你有没有理由使用ROW_NUMBER() OVER (ORDER BY NULL) rnum而不是ROWNUM rnum?您可能会发现使用rownum伪列会产生比分析row_number()更简单的计划。这两个表达式都没有对结果施加顺序,也不能保证从一个页面到下一个页面的排序的稳定性。

@ShannonSeverance:实际上,查询是按一组唯一的列排序的,而不是NULL(抱歉混淆 - 我修改了伪代码)。我已经尝试了一些其他没有使用分析的表达式,但它们似乎都遇到了相同的列限制。

@Lamak:所有桌子都有钥匙,但我不确定我是否按照你的建议。

这是一个非常常见的问题。看[here] [1] [1]:stackoverflow.com/questions/11680364/oracle-faster-paging-query/

@AlessandroRossi:我不认为你真的读过我的问题。

@drrcknlsn是的,你明白了!!我真的不能忍受1000列限制,我们在2012年!非常令人惊讶的是甲骨文无法处理更多,我认为它仍然是一个非常古老的限制。退出问题的最佳方法可能是列出查询中使用的列(如果可以的话)。

好吧,这会比你计划的更糟糕,但我的观点是你可以这样尝试分页:

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;

我现在明白了,谢谢你的回答。我尝试了这种方法,我仍然得到相同的1000列限制错误。我假设这是由于这些查询使用连接数据作为子查询(Oracle尝试创建临时视图?),因此正在应用列限制。

@drrcknlsn我明白了,然后我需要自己尝试用1000列的表来看看我是否想出了一些东西

仅仅是为了澄清,我的表中没有一列有超过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 = pagesize。

AAA =起点

为了澄清,这个例子中的f.c1应该是关键字段吗?是order by whatever应该是我将结果集排序的列放在哪里?我这么认为,但我得到的结果并没有按照我放在那里的顺序排序。我今天有记录,我指定的第一个order by列是修改日期,降序,但我看到的结果是从2011年开始订购的。我认为这与内部最多的order by有关。

主要的顺序是在内部的sql order by f.c1中放置你想要的任何东西(外部的一个应该在逻辑上可能是相同的顺序)

是的f.c1 = f2.a1只是连接键(你可能有几个)。我在你的例子中说了两个表,那里有很多表。所以把你想要的所有表放在那里......加入它们,然后按照你认为合适的顺序排序。所有内部的sql。第一行提示是告诉oracle你只对前几个结果感兴趣(从完全扫描中劝阻它可以避免它)。

谢谢,这很好用。

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

SELECT foo"c0",

bar"c1",

baz"c2",

...

FROM   some_table

WHERE  ... AND

rownum <= 10

这是为了分页,所以我需要能够一次返回一页结果,从任意偏移开始,而不是每次都是前10。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值