1

XQUERY を使用しています。データベースに 25000 のレコードが保存されています。これらのレコードをチャンク (1000) で選択したいのですが、レコードを再帰的に取得するにはどうすればよいですか?

4

1 に答える 1

1

ウィンドウクエリ</h2>

この目的でタンブリング ウィンドウを使用できますが、残念ながら多くの XQuery エンジンではまだサポートされていません。


次の提案については、結果を XML にラップする必要があります。XQuery はフラット シーケンスのみを認識し、ネストされたシーケンスは認識しないためです。

独自のタンブリング ウィンドウを作成する

次のような独自のタンブリング ウィンドウ関数を作成できます。これは、$countそれぞれ「item」要素を含む「 window」要素を作成します。

declare function local:window($seq as item()*, $size as xs:integer) as item()* {
    for $i in 1 to xs:integer(fn:ceiling(count($seq) div $size))
  return
      element {"window"} {
          for $j in (($i - 1) * $size + 1) to $i*$size
          return 
              element {"item"} {$seq[$j]}
        }
};


local:window((2, 4, 6, 8, 10, 12, 14), 3)

再帰ウィンドウの分割シーケンス

この問題を再帰的に解決したい場合は、残念ながら標準の xquery では利用できない分割関数が必要になります。を使用$n=1000して、「ヘッド」要素を操作し、「テール」を使用して「ワーカー関数」を再帰的に呼び出すことができます。

declare function local:split($seq as item()*, $n as xs:integer) as element()* {
    (
        element {"head"} {
            for $i in subsequence($seq, 1, $n)
            return element {"item"} {$i}
        },
        element {"tail"} {
            for $i in subsequence($seq, $n+1)
            return element {"item"} {$i}
        }
    )
};

local:split((2, 4, 6, 8, 10, 12, 14), 3)

テール要素にシーケンスとしてアクセスするには、次を使用します

local:split((2, 4, 6, 8, 10, 12, 14), 3)[2]//item/data()
于 2012-05-28T07:55:46.643 に答える