2013-01-17 66 views
2

我正在檢索數據並將其插入到另一個文件中。但插入的數據沒有排序。以下是我試圖實現的例子。XQuery同時獲取並插入

let $n := <N> 
<n>Lemon</n> 
<n>Chickoo</n> 
<n>Banana</n> 
<n>Orange</n> 
<n>Pineapple</n> 
<n>Apple</n> 
<n>Lemon</n> 
<n>Chickoo</n> 
<n>Banana</n> 
</N> 

for $x in distinct-values($n/n) 
order by $x 
return 
    insert node <n>{$x}</n> into doc('fruits')/fruit 

fruits的輸出如下 -

<fruit> 
      <n>Lemon</n> 
      <n>Chickoo</n> 
      <n>Banana</n> 
      <n>Orange</n> 
      <n>Pineapple</n> 
      <n>Apple</n> 
    </fruit> 

它不是有序的,但提到當檢索... !!!

回答

2

這是BaseX評估order by FLWOR子句的一個錯誤,該子句現在記錄在GitHub bug tracker上。 return子句在排序前被評估而不是後綴,因此按錯誤順序添加更新。

一種解決方法是要麼執行排序在另一個FLWOR表達式:

for $x in 
    for $d in distinct-values($n/n) 
    order by $d 
    return $d 
order by $x 
return 
    insert node <n>{$x}</n> into doc('fruits')/fruit 

另一個(可能更優雅)解決方案是使用insert nodes,只需要進行一次評估:

insert nodes 
    for $x in distinct-values($n/n) 
    order by $x 
    return <n>{$x}</n> 
into doc('fruits')/fruit 
+0

非常感謝。有效。 :) – John

0

這感覺就像是一個bug。規範說:

如果多個節點由單個插入表達式插入,它們的順序將保留源表達式的節點順序。

這不完全清晰,但我認爲這意味着你有權期望結果被正確排序。

您使用的是什麼XQuery Update實現?

+0

這是BaseX中的一個錯誤,我在GitHub上提交了一個[bug報告](https://github.com/BaseXdb/basex/issues/621)。 –