【发布时间】:2012-10-30 04:10:35
【问题描述】:
我有一个如下所示的 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并在之后进行过滤。听起来不是很理想,但却是一种方式 -
@ShannonSeverance:实际上,查询是按一组唯一的列排序的,而不是 NULL(抱歉造成混淆 - 我修改了伪代码)。我尝试了其他一些不使用分析的表达式,但它们似乎都遇到了相同的列限制。
标签: sql oracle pagination