3

次のような 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 列以上を選択しないなどの提案には興味がありません。これらの方法はすべて十分に認識しています。

4

3 に答える 3

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;
于 2012-11-09T20:31:22.880 に答える
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 = ページサイズ。AAA = 開始点

于 2012-11-09T20:50:13.693 に答える
-1

問題はページネーションですか、それとも最初の 10 行を返すだけですか? 後者の場合は、次のことができます。

SELECT foo "c0",
       bar "c1",
       baz "c2",
       ...
FROM   some_table
WHERE  ... and
       rownum <= 10
于 2012-11-09T19:52:53.523 に答える