Xquery:一次选择n个记录

时间:2012-05-28 05:47:42

标签: xquery xquery-sql

我正在使用XQUERY,我在数据库中保存了25000条记录,我想在块中选择这些记录(1000),如何递归获取记录?

1 个答案:

答案 0 :(得分:1)

窗口查询

你可以使用tumbling window来达到这个目的,遗憾的是它还没有得到许多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,使用“head”元素并使用“tail”以递归方式调用“worker function”。

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()